library(here)
here() starts at C:/Users/User/OneDrive - Universidad de Oviedo/IMIB/Analyses/MOTIVATE/DB_first_check
library(readr)
library(tidyr)
library(dplyr)
Adjuntando el paquete: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(lubridate)
Adjuntando el paquete: ‘lubridate’
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
library(ggplot2)
library(stringr)
library(purrr)
library(readxl)
db<-read_tsv(here("data", "raw",
"200_MOTIVATE20240412_header_notJUICE_with_precise_coordinates.csv"))
Aviso: One or more parsing issues, call `problems()` on your data frame for
details, e.g.:
dat <- vroom(...)
problems(dat)
Quitting from lines 25-27 [unnamed-chunk-2] (db_first_check.Rmd)
Rows: 2387117 Columns: 69── Column specification ────────────────────────────────────────────────────
Delimiter: "\t"
chr (33): Country, Biblioreference, Nr. table in publ., Nr. relevé in ta...
dbl (20): PlotObservationID, PlotID, TV2 relevé number, Relevé area (m²)...
lgl (16): Lon1, Lon2, Lon3, Lon4, Lat1, Lat2, Lat3, Lat4, X1, X2, X3, X4...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
problems<-problems(db)
sort(unique(problems$col))
[1] 52 53 54 55 56 57 58 59 62 63 64 65 66 67 68 69
names(db[52:69])
[1] "Lon1" "Lon2" "Lon3" "Lon4" "Lat1" "Lat2" "Lat3" "Lat4" "X" "Y"
[11] "X1" "X2" "X3" "X4" "Y1" "Y2" "Y3" "Y4"
We will not use these columns, so no problem!
db_resurv <- db %>% filter(`ReSurvey plot (Y/N)` == "Y")
Create new column with old coordinates if new not available, and with new if available.
db_resurv <- db_resurv %>%
mutate(Lon_updated = ifelse(is.na(Lon_prec),Longitude,Lon_prec),
Lat_updated = ifelse(is.na(Lat_prec),Latitude,Lat_prec))
print(db_resurv, width = Inf)
Save to csv:
write_csv(db_resurv,here("data", "clean","db_resurv.csv"))
Careful! Sometimes ReSurvey plot is NA.
nrow(db_resurv%>%filter(is.na(RS_CODE)))
[1] 0
nrow(db_resurv%>%filter(is.na(`ReSurvey site`)))
[1] 0
nrow(db_resurv%>%filter(is.na(`ReSurvey plot`)))
[1] 111
write_csv(db_resurv %>% filter(is.na(`ReSurvey plot`)),
here("output", "csv","issue1.csv"))
Coordinates are also NA in some cases.
nrow(db_resurv%>%filter(is.na(Lon_updated) & is.na(Lat_updated )))
[1] 949
write_csv(db_resurv %>% filter(is.na(Lon_updated) & is.na(Lat_updated)),
here("output", "csv","issue2.csv"))
But Resurvey plot and coordinates are never missing at the same time.
nrow(db_resurv%>%
filter(is.na(`ReSurvey plot`) & is.na(Lon_updated) & is.na(Lat_updated)))
[1] 0
Careful! In some cases different ReSurvey observations within the same plot have different coordinates.
Create two new columns in db_resurv: coordinates_equal indicating if coordinates are exactly equal between ReSurvey observations, and coordinates_consistent, indicating if coordinates are consistent between ReSurvey observations (consistent meaning that difference < 0.001 degrees).
# Define a threshold (e.g., 0.001 degrees for longitude/latitude differences)
threshold <- 0.001
db_resurv <- db_resurv %>%
group_by(RS_CODE, `ReSurvey site`, `ReSurvey plot`) %>%
mutate(
lon_range = ifelse(all(is.na(Lon_updated)), NA,
max(Lon_updated, na.rm = T) -
min(Lon_updated, na.rm = T)),
lat_range = ifelse(all(is.na(Lat_updated)), NA,
max(Lat_updated, na.rm = T) -
min(Lat_updated, na.rm = T)),
coordinates_equal = ifelse(is.na(Lon_updated) & is.na(Lat_updated), NA,
lon_range == 0 & lat_range == 0),
coordinates_consistent = ifelse(is.na(Lon_updated) & is.na(Lat_updated), NA,
lon_range < threshold &
lat_range < threshold)
) %>%
ungroup() %>%
select(-lon_range, -lat_range)
write_csv(db_resurv %>% filter(coordinates_equal==FALSE),
here("output", "csv","issue3.csv"))
db_resurv %>%
group_by(RS_CODE,`ReSurvey site`, `ReSurvey plot`) %>%
summarize(is_equal = all(coordinates_equal),
is_consistent = all(coordinates_consistent),
.groups = "drop") %>%
mutate(coordinate_status = case_when(
is_equal ~ "Equal",
!is_equal & is_consistent ~ "Consistent (< 0.001º)",
!is_equal & !is_consistent ~ "Inconsistent (> 0.001º)")) %>%
count(coordinate_status)%>%
mutate(percentage = n / sum(n) * 100) %>%
ggplot(aes(x = percentage, y = coordinate_status, fill = coordinate_status)) +
geom_bar(stat = "identity") +
geom_text(aes(label = paste0(round(percentage, 1), "%")),
position = position_stack(vjust = 0.5), size = 3) +
labs(x = "Percentage of Plots", y = NULL) +
theme(axis.text.y = element_text(size = 12)) +
coord_flip() + theme(legend.position = "none")
ggsave(filename=here("output", "figures","issue3.tiff"),
width=10,height=7,units="cm",dpi=300)
When ReSurvey plot is not NA, use the unique combination of RS_CODE, ReSurvey site and ReSurvey plot to uniquely define each ReSurvey plot (as defined in metadata). When ReSurvey plot is NA (111 rows), use the unique combination of RS_CODE, ReSurvey site and updated coordinates to uniquely define each ReSurvey plot. Check how many resurveys (i.e. different years are there for each unique combination).
count_resurveys <- db_resurv %>%
# Convert dates to date format and get the year
mutate(date = dmy(`Date of recording`), year = year(date)) %>%
group_by(RS_CODE, `ReSurvey site`,
# If ReSurvey plot is not NA,
# group by RS_CODE, `ReSurvey site`, `ReSurvey plot`
`ReSurvey plot` = ifelse(is.na(`ReSurvey plot`),
NA_character_, `ReSurvey plot`),
# If ReSurvey plot is NA, group by coordinates
Lon_updated = ifelse(is.na(`ReSurvey plot`), Lon_updated, NA_real_),
Lat_updated = ifelse(is.na(`ReSurvey plot`) , Lat_updated, NA_real_)
) %>%
summarise(
# Get how many different years for each unique group
distinct_years=n_distinct(year),
# Get how many different dates for each unique group
distinct_dates=n_distinct(date), .groups = "drop")
Summary stats:
summary(count_resurveys$distinct_years)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.000 2.000 3.449 4.000 55.000
sd(count_resurveys$distinct_years)
[1] 2.677649
Histograms:
# For all data
ggplot(count_resurveys, aes(x = distinct_years)) +
geom_histogram(fill = "white", color = "black", bins = 55)+
xlab("Number of ReSurvey observations (different years)") +
ylab("Number of plots")
ggsave(filename=here("output", "figures","issue4.tiff"),
width=11,height=7,units="cm",dpi=300)
Number and proportion of plots with only 1 resurvey (should not be so!)
nrow(count_resurveys%>%filter(distinct_years==1))
[1] 1158
nrow(count_resurveys%>%filter(distinct_years==1))/nrow(count_resurveys)
[1] 0.009573571
write_csv(count_resurveys%>%filter(distinct_years==1),
here("output", "csv","issue4.csv"))
db_resurv %>%
filter(`Cover abundance scale`=="Presence/Absence") %>%
distinct(Dataset)
ggplot(db_resurv %>%
mutate(pres_or_ab =ifelse(`Cover abundance scale`=="Presence/Absence",
"Presence/Absence", "Abundance"),
DK_Naturdata_Res = ifelse(Dataset == "DK_Naturdata_Res",
"Y", "N")),
aes(pres_or_ab, fill = DK_Naturdata_Res)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage", x = NULL)
ggsave(filename=here("output", "figures","issue5.tiff"),
width=12,height=7,units="cm",dpi=300)
For DK_Naturdata_Res - info about habitat from Jerker’s file (see below).
Read text file wrong_countries obtained in ArcGIS:
wrong_countries <- read_delim(here("data", "clean","wrong_countries.txt"),
delim = ";")
Rows: 1850 Columns: 19── Column specification ────────────────────────────────────────────────────
Delimiter: ";"
chr (12): Country, RS_CODE, ReSurvey_s, ReSurvey_p, Lon_update, Lat_upda...
dbl (7): FID, Join_Count, TARGET_FID, plot_uniqu, year, obs_unique, Plo...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxud3JvbmdfY291bnRyaWVzIDwtIHJlYWRfZGVsaW0oaGVyZShcImRhdGFcIiwgXCJjbGVhblwiLFwid3JvbmdfY291bnRyaWVzLnR4dFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltID0gXCI7XCIpXG5gYGAifQ== -->
```r
wrong_countries <- read_delim(here(\data\, \clean\,\wrong_countries.txt\),
delim = \;\)
```
<!-- rnb-source-end -->
```r
wrong_countries <- read_delim(here(\data\, \clean\,\wrong_countries.txt\),
delim = \;\)
<!-- rnb-source-end -->
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiUm93czogMTg1MCBDb2x1bW5zOiAxOeKUgOKUgCBDb2x1bW4gc3BlY2lmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbkRlbGltaXRlcjogXFw7XFxcbmNociAoMTIpOiBDb3VudHJ5LCBSU19DT0RFLCBSZVN1cnZleV9zLCBSZVN1cnZleV9wLCBMb25fdXBkYXRlLCBMYXRfdXBkYXRlLCBFLi4uXG5kYmwgICg3KTogRklELCBKb2luX0NvdW50LCBUQVJHRVRfRklELCBwbG90X3VuaXF1LCB5ZWFyLCBvYnNfdW5pcXVlLCBQbG90T2JzSURcbuKEuSBVc2UgYHNwZWMoKWAgdG8gcmV0cmlldmUgdGhlIGZ1bGwgY29sdW1uIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgZGF0YS5cbuKEuSBTcGVjaWZ5IHRoZSBjb2x1bW4gdHlwZXMgb3Igc2V0IGBzaG93X2NvbF90eXBlcyA9IEZBTFNFYCB0byBxdWlldCB0aGlzIG1lc3NhZ2UuXG4ifQ== -->
Rows: 1850 Columns: 19── Column specification
───────────────────────────────────────────────────────── Delimiter:
;
chr (12): Country, RS_CODE, ReSurvey_s, ReSurvey_p, Lon_update,
Lat_update, E… dbl (7): FID, Join_Count, TARGET_FID, plot_uniqu, year,
obs_unique, PlotObsID ℹ Use spec() to retrieve the full
column specification for this data. ℹ Specify the column types or set
show_col_types = FALSE to quiet this message.
<!-- rnb-output-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
# ISSUE 7: Different cover abundance scales
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0dCRGIzWmxjaUJoWW5WdVpHRnVZMlVnYzJOaGJHVmdLU2tnSzF4dUlDQWdJQ0FnSUNBZ1oyVnZiVjlpWVhJb1lXVnpLSGtnUFNBb0xpNWpiM1Z1ZEM0dUtTQXZJSE4xYlNndUxtTnZkVzUwTGk0cElDb2dNVEF3S1NrZ0sxeHVJQ0JzWVdKektIa2dQU0JjSWxCbGNtTmxiblJoWjJVZ2IyWWdVbVZUZFhKMlpYa2diMkp6WlhKMllYUnBiMjV6WENJc0lIZ2dQU0JjSWtOdmRtVnlJR0ZpZFc1a1lXNWpaU0J6WTJGc1pWd2lLU0FyWEc0Z0lHTnZiM0prWDJac2FYQW9LVnh1WjJkellYWmxLR1pwYkdWdVlXMWxQV2hsY21Vb1hDSnZkWFJ3ZFhSY0lpd2dYQ0ptYVdkMWNtVnpYQ0lzWENKcGMzTjFaVGN1ZEdsbVpsd2lLU3hjYmlBZ0lDQWdJQ0IzYVdSMGFEMHhPQ3hvWldsbmFIUTlNVEFzZFc1cGRITTlYQ0pqYlZ3aUxHUndhVDB6TURBcFhHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBDb3ZlciBhYnVuZGFuY2Ugc2NhbGVgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsIHggPSBcIkNvdmVyIGFidW5kYW5jZSBzY2FsZVwiKSArXG4gIGNvb3JkX2ZsaXAoKVxuZ2dzYXZlKGZpbGVuYW1lPWhlcmUoXCJvdXRwdXRcIiwgXCJmaWd1cmVzXCIsXCJpc3N1ZTcudGlmZlwiKSxcbiAgICAgICB3aWR0aD0xOCxoZWlnaHQ9MTAsdW5pdHM9XCJjbVwiLGRwaT0zMDApXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBDb3ZlciBhYnVuZGFuY2Ugc2NhbGVgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsIHggPSBcIkNvdmVyIGFidW5kYW5jZSBzY2FsZVwiKSArXG4gIGNvb3JkX2ZsaXAoKVxuZ2dzYXZlKGZpbGVuYW1lPWhlcmUoXCJvdXRwdXRcIiwgXCJmaWd1cmVzXCIsXCJpc3N1ZTcudGlmZlwiKSxcbiAgICAgICB3aWR0aD0xOCxoZWlnaHQ9MTAsdW5pdHM9XCJjbVwiLGRwaT0zMDApXG5gYGAifQ== -->
```r
ggplot(db_resurv, aes(`Cover abundance scale`)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations", x = "Cover abundance scale") +
coord_flip()
ggsave(filename=here("output", "figures","issue7.tiff"),
width=18,height=10,units="cm",dpi=300)
Used this info in metadata file:
Expert system classification to EUNIS habitats (https://zenodo.org/records/4812736 ; https://floraveg.eu/habitat/). I am sending you legend for EUNIS classification version 2022-10-16 with all codes and meanings, directly prepared from expert system file (second sheet) - it is slightly different from published version in ZENODO (https://zenodo.org/records/4812736 , little bit old dated now) and from https://floraveg.eu/habitat/ (little bit newer than in current EVA version).
Qa = mires and Qb = wetlands P units – in floraveg.eu there is slightly different classification (https://floraveg.eu/habitat/overview/P), but in EVA is still this classification of P:
P Surface waters Pa Base-poor spring and spring brook Pb Calcareous spring and spring brook Pc Brackish-water vegetation Pd Fresh-water small pleustophyte vegetation Pe Fresh-water large pleustophyte vegetation Pf Fresh-water submerged vegetation Pg Fresh-water nymphaeid vegetation Ph Oligotrophic-water vegetation Pi Dystrophic-water vegetation Pj Stonewort vegetation
Presence of “!” simply means that for one unit there are two or more different formulas, e.g. R11 and R11!. So it is only technical stuff.
Multiple assignment of relevé – no priority, alphabetical order, e.g. N16!,S66,S81 means that relevé can be assigned to all 3 units: N16 Mediterranean and Macaronesian coastal dune grassland (grey dune), S66 Mediterranean halo-nitrophilous scrub and S81 Canarian xerophytic scrub
No value present in Expert System – relevé didn´t enter expert system classification (= it means that some prerequisites are missing)
“~” – relevé entered expert classification however was not classified to any EUNIS unit +
Clean info on Expert system column and separate it when there are several codes.
db_resurv <- db_resurv %>%
mutate(
# Clean 'Expert System' column by removing "!" and replacing "~" with NA
`Expert System` = case_when(
`Expert System` == "~" ~ NA_character_, # Replace "~" with NA
TRUE ~ str_replace_all(`Expert System`, "!", "") # Remove "!"
)
) %>%
# Separate the values in 'Expert System' into multiple columns
separate(
`Expert System`,
into = c("EUNISa", "EUNISb", "EUNISc", "EUNISd"),
sep = ",",
extra = "drop", # Drop extra values if there are more than columns
fill = "right", # Fill missing values with NA for cases with fewer values
remove = FALSE # Keep the original 'Expert System' column
)
Calculate how many different EUNIS codes have been assigned:
db_resurv <- db_resurv %>%
mutate(
# Count the number of non-NA values across the EUNIS columns
n_EUNIS = rowSums(!is.na(select(., starts_with("EUNIS"))))
)
ggplot(db_resurv, aes(n_EUNIS)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "Number of differnt EUNIS codes assigned") + coord_flip()
ggplot(db_resurv %>% filter(n_EUNIS > 0), aes(n_EUNIS)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "Number of differnt EUNIS codes assigned") + coord_flip()
Correct some EUNIS codes that are probably wrong:
db_resurv <- db_resurv %>%
mutate(across(starts_with("EUNIS"), ~ case_when(
. == "N16M" ~ "N16",
. == "Sa" ~ "V4",
. == "Sb" ~ "V5",
. == "T1CT" ~ "T1C",
. == "N15A" ~ "N15",
TRUE ~ .
)))
Add columns for the different EUNIS levels:
db_resurv <- db_resurv %>%
mutate(
# EUNISa levels
EUNISa_1 = substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 2, 1)),
EUNISa_2 = ifelse(
nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 3, 2),
substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 3, 2)),
NA_character_
),
EUNISa_3 = ifelse(
nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 4, 3),
substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 4, 3)),
NA_character_
),
EUNISa_4 = ifelse(
nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 5, 4),
substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 5, 4)),
NA_character_
),
# EUNISb levels
EUNISb_1 = substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 2, 1)),
EUNISb_2 = ifelse(
nchar(EUNISb) >= ifelse(str_starts(EUNISb, "MA"), 3, 2),
substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 3, 2)),
NA_character_
),
EUNISb_3 = ifelse(
nchar(EUNISb) >= ifelse(str_starts(EUNISb, "MA"), 4, 3),
substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 4, 3)),
NA_character_
),
EUNISb_4 = ifelse(
nchar(EUNISb) >= ifelse(str_starts(EUNISb, "MA"), 5, 4),
substr(EUNISb, 1, ifelse(str_starts(EUNISb, "MA"), 5, 4)),
NA_character_
),
# EUNISc levels
EUNISc_1 = substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 2, 1)),
EUNISc_2 = ifelse(
nchar(EUNISc) >= ifelse(str_starts(EUNISc, "MA"), 3, 2),
substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 3, 2)),
NA_character_
),
EUNISc_3 = ifelse(
nchar(EUNISc) >= ifelse(str_starts(EUNISc, "MA"), 4, 3),
substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 4, 3)),
NA_character_
),
EUNISc_4 = ifelse(
nchar(EUNISc) >= ifelse(str_starts(EUNISc, "MA"), 5, 4),
substr(EUNISc, 1, ifelse(str_starts(EUNISc, "MA"), 5, 4)),
NA_character_
),
# EUNISd levels
EUNISd_1 = substr(EUNISd, 1, ifelse(str_starts(EUNISc, "MA"), 2, 1)),
EUNISd_2 = ifelse(
nchar(EUNISd) >= ifelse(str_starts(EUNISd, "MA"), 3, 2),
substr(EUNISd, 1, ifelse(str_starts(EUNISd, "MA"), 3, 2)),
NA_character_
),
EUNISd_3 = ifelse(
nchar(EUNISd) >= ifelse(str_starts(EUNISd, "MA"), 4, 3),
substr(EUNISd, 1, ifelse(str_starts(EUNISd, "MA"), 4, 3)),
NA_character_
),
EUNISd_4 = ifelse(
nchar(EUNISd) >= ifelse(str_starts(EUNISd, "MA"), 5, 4),
substr(EUNISd, 1, ifelse(str_starts(EUNISd, "MA"), 5, 4)),
NA_character_
)
)
Create new columns with descriptions for the level 1 codes:
db_resurv <- db_resurv %>%
mutate(
EUNISa_1_descr = case_when(
EUNISa_1 == "V" ~ "Vegetated man-made habitats",
EUNISa_1 == "U" ~ "Inland habitats with no or little soil",
EUNISa_1 == "T" ~ "Forests and other wooded land",
EUNISa_1 == "S" ~ "Heathlands, scrub and tundra",
EUNISa_1 == "R" ~ "Grasslands",
EUNISa_1 == "Q" ~ "Wetlands",
EUNISa_1 == "P" ~ "Inland waters",
EUNISa_1 == "N" ~ "Coastal habitats",
EUNISa_1 == "MA" ~ "Marine habitats",
TRUE ~ NA_character_
),
EUNISb_1_descr = case_when(
EUNISb_1 == "V" ~ "Vegetated man-made habitats",
EUNISb_1 == "U" ~ "Inland habitats with no or little soil",
EUNISb_1 == "T" ~ "Forests and other wooded land",
EUNISb_1 == "S" ~ "Heathlands, scrub and tundra",
EUNISb_1 == "R" ~ "Grasslands",
EUNISb_1 == "Q" ~ "Wetlands",
EUNISb_1 == "P" ~ "Inland waters",
EUNISb_1 == "N" ~ "Coastal habitats",
EUNISb_1 == "MA" ~ "Marine habitats",
TRUE ~ NA_character_
),
EUNISc_1_descr = case_when(
EUNISc_1 == "V" ~ "Vegetated man-made habitats",
EUNISc_1 == "U" ~ "Inland habitats with no or little soil",
EUNISc_1 == "T" ~ "Forests and other wooded land",
EUNISc_1 == "S" ~ "Heathlands, scrub and tundra",
EUNISc_1 == "R" ~ "Grasslands",
EUNISc_1 == "Q" ~ "Wetlands",
EUNISc_1 == "P" ~ "Inland waters",
EUNISc_1 == "N" ~ "Coastal habitats",
EUNISc_1 == "MA" ~ "Marine habitats",
TRUE ~ NA_character_
),
EUNISd_1_descr = case_when(
EUNISd_1 == "V" ~ "Vegetated man-made habitats",
EUNISd_1 == "U" ~ "Inland habitats with no or little soil",
EUNISd_1 == "T" ~ "Forests and other wooded land",
EUNISd_1 == "S" ~ "Heathlands, scrub and tundra",
EUNISd_1 == "R" ~ "Grasslands",
EUNISd_1 == "Q" ~ "Wetlands",
EUNISd_1 == "P" ~ "Inland waters",
EUNISd_1 == "N" ~ "Coastal habitats",
EUNISd_1 == "MA" ~ "Marine habitats",
TRUE ~ NA_character_
)
)
Plot for EUNISa_1 (the first assigned EUNIS in cases of multiple assignations, level 1):
ggplot(db_resurv, aes(EUNISa_1_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 1") + coord_flip()
ggplot(db_resurv %>% filter(!is.na(EUNISa_1_descr)), aes(EUNISa_1_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 1") + coord_flip()
ggsave(filename=here("output", "figures","issue8.tiff"),
width=18,height=10,units="cm",dpi=300)
ggplot(db_resurv, aes(`Manipulate (y/n)`)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "Manipulation")
ggsave(filename=here("output", "figures","issue9.tiff"),
width=10,height=8,units="cm",dpi=300)
List of Type of Manipulation in manipulated plots (mixed information):
write_csv(data.frame(unique(db_resurv$`Type of manipulation`)),
here("output", "csv","issue9.csv"))
ggplot(db_resurv, aes(`Location method`)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "Location method") + coord_flip()
ggsave(filename=here("output", "figures","issue10.tiff"),
width=18,height=8,units="cm",dpi=300)
unique(db_resurv$RS_PROJTYP)
[1] "resampling" "permanent" "permanent (man)" "Permanent (man)"
[5] "Resampling"
Unify codes:
db_resurv <- db_resurv %>%
mutate(RS_PROJTYP = recode(RS_PROJTYP,
"Resampling" = "resampling",
"Permanent (man)" = "permanent (man)"))
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiVcbiAgbXV0YXRlKFJTX1BST0pUWVAgPSByZWNvZGUoUlNfUFJPSlRZUCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJSZXNhbXBsaW5nXCIgPSBcInJlc2FtcGxpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJQZXJtYW5lbnQgKG1hbilcIiA9IFwicGVybWFuZW50IChtYW4pXCIpKVxuYGBgIn0= -->
```r
db_resurv <- db_resurv %>%
mutate(RS_PROJTYP = recode(RS_PROJTYP,
\Resampling\ = \resampling\,
\Permanent (man)\ = \permanent (man)\))
```
<!-- rnb-source-end -->
```r
db_resurv <- db_resurv %>%
mutate(RS_PROJTYP = recode(RS_PROJTYP,
\Resampling\ = \resampling\,
\Permanent (man)\ = \permanent (man)\))
<!-- rnb-source-end -->
<!-- rnb-output-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0ZKVFgxQlNUMHBVV1ZBc0lHWnBiR3c5WUUxaGJtbHdkV3hoZEdVZ0tIa3ZiaWxnS1NrZ0sxeHVJQ0FnSUNBZ0lDQWdaMlZ2YlY5aVlYSW9ZV1Z6S0hrZ1BTQW9MaTVqYjNWdWRDNHVLU0F2SUhOMWJTZ3VMbU52ZFc1MExpNHBJQ29nTVRBd0tTa2dLMXh1SUNCc1lXSnpLSGtnUFNCY0lsQmxjbU5sYm5SaFoyVWdiMllnVW1WVGRYSjJaWGtnYjJKelpYSjJZWFJwYjI1elhDSXNYRzRnSUNBZ0lDQWdlQ0E5SUZ3aVVtVnpkWEoyWlhrZ2NISnZhbVZqZENCMGVYQmxYQ0lwSUNzZ1kyOXZjbVJmWm14cGNDZ3BJQ3RjYmlBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVJRDBnWENKMGIzQmNJaWxjYm1kbmMyRjJaU2htYVd4bGJtRnRaVDFvWlhKbEtGd2liM1YwY0hWMFhDSXNJRndpWm1sbmRYSmxjMXdpTEZ3aWFYTnpkV1V4TVM1MGFXWm1YQ0lwTEZ4dUlDQWdJQ0FnSUhkcFpIUm9QVEU0TEdobGFXZG9kRDA0TEhWdWFYUnpQVndpWTIxY0lpeGtjR2s5TXpBd0tWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKFJTX1BST0pUWVAsIGZpbGw9YE1hbmlwdWxhdGUgKHkvbilgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsXG4gICAgICAgeCA9IFwiUmVzdXJ2ZXkgcHJvamVjdCB0eXBlXCIpICsgY29vcmRfZmxpcCgpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXCJ0b3BcIilcbmdnc2F2ZShmaWxlbmFtZT1oZXJlKFwib3V0cHV0XCIsIFwiZmlndXJlc1wiLFwiaXNzdWUxMS50aWZmXCIpLFxuICAgICAgIHdpZHRoPTE4LGhlaWdodD04LHVuaXRzPVwiY21cIixkcGk9MzAwKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKFJTX1BST0pUWVAsIGZpbGw9YE1hbmlwdWxhdGUgKHkvbilgKSkgK1xuICAgICAgICAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSAvIHN1bSguLmNvdW50Li4pICogMTAwKSkgK1xuICBsYWJzKHkgPSBcIlBlcmNlbnRhZ2Ugb2YgUmVTdXJ2ZXkgb2JzZXJ2YXRpb25zXCIsXG4gICAgICAgeCA9IFwiUmVzdXJ2ZXkgcHJvamVjdCB0eXBlXCIpICsgY29vcmRfZmxpcCgpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXCJ0b3BcIilcbmdnc2F2ZShmaWxlbmFtZT1oZXJlKFwib3V0cHV0XCIsIFwiZmlndXJlc1wiLFwiaXNzdWUxMS50aWZmXCIpLFxuICAgICAgIHdpZHRoPTE4LGhlaWdodD04LHVuaXRzPVwiY21cIixkcGk9MzAwKVxuYGBgIn0= -->
```r
ggplot(db_resurv, aes(RS_PROJTYP, fill=`Manipulate (y/n)`)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "Resurvey project type") + coord_flip() +
theme(legend.position = "top")
ggsave(filename=here("output", "figures","issue11.tiff"),
width=18,height=8,units="cm",dpi=300)
db_resurv %>% filter(!is.na(RS_DUPL)) %>% select(RS_CODE, RS_DUPL) %>%
distinct()
db_resurv <- db_resurv %>%
# Redefine precision_new, which was wrong
mutate(precision_new = factor(ifelse(is.na(Lon_prec) & is.na(Lat_prec),
0, 1)))
ggplot(db_resurv, aes(`Location uncertainty (m)`, fill = precision_new)) +
geom_histogram( color = "black") +
xlab("Location uncertainty (m)")
ggplot(db_resurv %>% filter(`Location uncertainty (m)` <= 500),
aes(`Location uncertainty (m)`, fill = precision_new)) +
geom_histogram(color = "black") +
xlab("Location uncertainty (m) <= 500")
ggsave(filename=here("output", "figures","issue13_1.tiff"),
width=18,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(`Location uncertainty (m)` > 500),
aes(`Location uncertainty (m)`, fill = precision_new)) +
geom_histogram(color = "black") +
xlab("Location uncertainty (m) > 500")
ggsave(filename=here("output", "figures","issue13_2.tiff"),
width=18,height=8,units="cm",dpi=300)
Unique slope values:
unique((db_resurv)$`Slope (°)`) %>% str_sort()
[1] "_" "-" "-1" "." "0" "0." "00" "03" "07" "1" "1." "10" "11" "12"
[15] "13" "14" "15" "16" "17" "18" "19" "2" "2." "20" "21" "22" "23" "24"
[29] "25" "26" "27" "28" "29" "3" "30" "31" "32" "33" "34" "35" "36" "37"
[43] "38" "39" "4" "4." "40" "41" "42" "43" "44" "45" "46" "47" "48" "5"
[57] "5." "50" "51" "52" "55" "58" "6" "6." "60" "65" "7" "70" "75" "77"
[71] "78" "8" "8." "80" "85" "9" "9." "90" "95" NA
Set altitude, slope and aspect as numeric:
db_resurv <- db_resurv %>%
mutate(
# Some altitude values have a "-" after the number,
# convert to numeric after removing that
Altitude = as.numeric(gsub("-", "", Altitude)),
# Some slope values are noted as "_" or "-", these should be NA,
# otherwise convert to numeric
`Slope (°)` = ifelse(`Slope (°)` == "_" | `Slope (°)` == "-",
NA, as.numeric(`Slope (°)`)),
# Convert aspect values to numeric
`Aspect (°)` = as.numeric(`Aspect (°)`)
)
Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Slope (°) = ifelse(`Slope (°)` == "_" | `Slope (°)` == "-",
NA, as.numeric(`Slope (°)`))`.
Caused by warning in `ifelse()`:
! NAs introducidos por coerción
Histograms:
ggplot(db_resurv, aes(Altitude)) +
geom_histogram(fill = "white", color = "black")
ggplot(db_resurv, aes(`Aspect (°)`)) +
geom_histogram(fill = "white", color = "black")
ggplot(db_resurv, aes(`Slope (°)`)) +
geom_histogram(fill = "white", color = "black")
ggsave(filename=here("output", "figures","issue8.tiff"),
width=18,height=10,units="cm",dpi=300)
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKEFsdGl0dWRlKSkgK1xuICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gXCJ3aGl0ZVwiLCBjb2xvciA9IFwiYmxhY2tcIilcbmBgYCJ9 -->
```r
ggplot(db_resurv, aes(Altitude)) +
geom_histogram(fill = \white\, color = \black\)
```
<!-- rnb-source-end -->
```r
ggplot(db_resurv, aes(Altitude)) +
geom_histogram(fill = \white\, color = \black\)
<!-- rnb-source-end -->
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIGV5Sm9aV2xuYUhRaU9qUXhPUzQyTlRNNUxDSjNhV1IwYUNJNk5qYzVMQ0prY0draU9pMHhMQ0p6YVhwbFgySmxhR0YyYVc5eUlqb3dMQ0pqYjI1a2FYUnBiMjV6SWpwYld6QXNJbHgxTURBeFlsc3pPRHMxT3pJMU5XMWdjM1JoZEY5aWFXNG9LV0FnZFhOcGJtY2dZR0pwYm5NZ1BTQXpNR0F1SUZCcFkyc2dZbVYwZEdWeUlIWmhiSFZsSUhkcGRHZ2dZR0pwYm5kcFpIUm9ZQzVjZFRBd01XSmJNemx0SWwwc1d6RXNJbGRoY201cGJtYzZJRngxTURBeFlsc3pPRHMxT3pJMU5XMVNaVzF2ZG1Wa0lETTBNRGt3TlNCeWIzZHpJR052Ym5SaGFXNXBibWNnYm05dUxXWnBibWwwWlNCdmRYUnphV1JsSUhSb1pTQnpZMkZzWlNCeVlXNW5aVnh1S0dCemRHRjBYMkpwYmlncFlDa3VYSFV3TURGaVd6TTViU0pkWFgwPSAtLT5cblxuPGltZyBzcmM9XFxkYXRhOmltYWdlL3BuZztiYXNlNjRcbiJ9 -->
<img src=:image/png;base64
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIC0tPlxuXG48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBdW9BQUFITkNBTUFBQUIvK0s2SEFBQUFzVkJNVkVVQUFBQUFBRG9BQUdZQU9wQUFacll6TXpNNkFBQTZBRG82a050TlRVMU5UVzVOVFk1TmJxdE5qc2htQUFCbUFEcG1aanBta0pCbXRyWm10djl1VFUxdVRXNXVUWTV1YmsxdWJxdHVqbzV1cStTT1RVMk9UVzZPVFk2T3lQK1FPZ0NRa0dhUTIvK3JiazJyYm02cjVQKzJaZ0MyMjVDMi83YTIvLy9JamszSS8vL2JrRHJiLzdiYi8vL2txMjdreU1qay8vL3I2K3YvdG1iL3lJNy8yNUQvNUt2Ly83Yi8vOGovLzl2Ly8rVC8vLyt5VmlrYUFBQUFDWEJJV1hNQUFCQWxBQUFRSlFFdUQyMTRBQUFRTkVsRVFWUjRuTzJkQzF2Yk9CWkEwK2ZXQmJxUFBxWXpNTER0aE4wQnRpa0xwQUgvL3grMmxwT3lCQnpMOXBVdFhkMXpQcVp1MWZSWVNRNGEyNEV3S3dGTU1JczlBWUJwSUhVd0FxbURFVWdkakVEcVlBUlNCeU1FU3YyL0hlbDh3ejRnMVNHTk5GRlNSenExbE5URklOVWhKWFV4U0hWSVNWME1VaDFTVWhlRFZJZVUxTVVnMVNFbGRURklkVWhKWFF4U0hWSlNGNE5VaDVUVXhTRFZJU1YxTVVoMVNFbGRERklkVWxJWGcxU0hsTlRGSU5VaEpYVXhTSFZJU1YwTVVoMVNVaGVEVkllVTFNVWcxU0cxbXZxc2taSHVMZElVcEdaVGI5S1FlczVTVWlkMUkxSlNKM1VqVWxJbmRTTlNVaWQxSTFKU0ozVWowanhTNzA5ejZsUFBBdXpBcW81MEtta2VxM3IvaVpHNk9TbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUkthbVR1aEVwcVpPNkVTbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUkthbVR1aEVwcVpPNkVTbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUkthbVR1aEVwcVpPNkVTbXBrN29SS2FtVHVoRXBxWk82RVNtcGs3b1JLYW1UdWhFcHFaTzZFU21wazdvUmFjcXBMejhVeFhGWjNuMHQ5czUzYkVnZGFVeG5vTlJYaDhmbDlkdDVlWGJnUHBvM3BJNDBwak5RNnRmN2w5WGlmYnc2bXBmTFQrZU5HMUpIR3RVWjhGaTlXdGxkMFZYWmpSdDNrMWNWSGt0VDFaMEhBVUxnaTJ1eGYrbEwzZEgvYzVCVjNadzA3VlY5VVoxNmtqclNaSjNCVWw5VUo2V2tqalJkWjZqVUYvWGxSRTVMa1NickRKVDY4dU42MWVaaUk5SlVuWUZTUHlzY3grWHFzSDYxcUhGRDZraGpPdm5DQURsSVZUaEpYUTVTRlU1U2w0TlVoWlBVNVNCVjRTUjFPVWhWT0VsZERsSVZUbEtYZzFTRms5VGxJRlhoSkhVNVNGVTRTVjBPVWhWT1VwZURWSVdUMU9VZ1ZlRWtkVGxJVlRoSlhRNVNGVTVTbDROVWhaUFU1U0JWNFNSMU9VaFZPRWxkRGxJVlRsS1hnMVNGazlUbElGWGhKSFU1U0ZVNFNWME9VaFZPVXBlRFZJV1QxT1VnVmVFa2RUbElWVGhKWFE1U0ZVNVNsNE5VaFpQVTVTQlY0U1IxT1VoVk9FbGREbElWVGxLWGcxU0ZrOVRsSUZYaEpIVTVTRlU0cDArOVAvemNVcGdXVm5Xa1UwbnpXTlg3VDR6VXpVbEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNFbWQxSTFJU1ozVWpVaEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNFbWQxSTFJU1ozVWpVaEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNFbWQxSTFJU1ozVWpVaEpuZFNOU0VtZDFJMUlTWjNValVoSm5kU05TRW1kMUkxSVNaM1VqVWhKbmRTTlNOTk9mZm5wdlBybFExSHNYNVozWDR1OTZrL2JHMUpIR3RNWkxQWFZvY3Y1K3FEK3c5bUIrM2kwSVhXa01aMmhVbDhVdjdwVi9leTNPdnVqdVZ2a3R6ZWtqalNxTTFUcTN5OWR6WGQvek4wZjNHK3J3TGMzN2k5ZVZiUlptdUhubHNLMGREaFdYeDM5VXJ5ZDcwN2QwZjl6a0ZYZG5EVGxWWDJkK3ZManZGejlmazdxU05OekJyNENVNVpQR3lkMXBDazRSMG1kMDFLazZUbkRwbjY5VngzRWZMN2tZaVBTOUp5QlYvVkZVYjlhdERwczJKQTYwcGhPdmpCQURsSVZUbEtYZzFTRms5VGxJRlhoSkhVNVNGVTRTVjBPVWhWT1VwZURWSVdUMU9VZ1ZlRWtkVGxJVlRoSlhRNVNGVTVTbDROVWhaUFU1U0JWNFNSMU9VaFZPRWxkRGxJVlRsS1hnMVNGazlUbElGWGhKSFU1U0ZVNFNWME9VaFZPVXBlRFZJV1QxT1VnVmVFa2RUbElWVGhKWFE1U0ZVNVNsNE5VaFpQVTVTQlY0U1IxT1VoVk9FbGREbElWVGxLWGcxU0ZrOVRsSUZYaEpIVTVTRlU0U1YwT1VoVk9VcGVEVklWellPby8vdnFsM2w0OS81UFVrYXB3Q2xPL0lIV2tTcHlEVWorZDNmT21iK21rampTT1U3aXFUd0kvdHhTbWhkTlNwRk5KRTFyVnk5dVQ5UUVNeCtwSWxUaUhwbjdhdjNGU1J4clRPZlJZL1YzLzgxRlNSeHJUT1RqMTk2U09kRFJwUXFuZm5yd2tkYVNqU1JOS3ZieWFEVjNXKzArTTFNMUpFMHI5eDdzWlYyQ1FqaVpOS0hVQi9TZEc2dWFrcEU3cVJxUUpwYzRCRE5JeHBRbWx2bUhBMS9DU090STRUdUVCekduL2E0NzlKMGJxNXFRSnBzNjNaaUExa2pyZm1vSFVSdW8vM25FQWcxU0pVM2dGNXNVM1VrZXF3OGwxZFRsSVZUaEpYUTVTRmM3QnFkKzhybzVmbmczNER0UCtFeU4xYzlLVVVyK3EzeXZnWXNEWE4vYWZHS21ia3lhVSt1M0orcnVRTHZxZmwvYWZHS21ia3lhVStzL3ZRdUlsSktTWnA4NnFqblJNYVVLcGM2eU9kRXhwU3FsekJRYnBpTktrVWg5TS80bVJ1amtwcVpPNkVXbFNxWjlXSjZSWEE5NklsOVNSeG5FT1RmMjB2dlRDVnpZaXpUMTFycXNqSFZPYVVPcjMxOVZKSGFrUzU5QURtUFVWOVp2WG9YOXF4cXdKVXJjbVRTbjFzYTZyTjJWTjZ1YWtTYVUrbVBhZGtUclNrWnlrTGdlcENtZTQxSmVmenN2eTdtdXh0MnRENmtoak9vT2x2anAwT1o4ZHVJL21EYWtqamVrTWxmcWkrTFZhMVZkSGM3ZTZOMjVJSFdsVVo2alV2MSs2bXBmcjNCczM3bGF2S3Rvc3pUdmg1NWJDdEhRNFZ2ZWw3bWovdkdKVlJ6cVNNK3hwS2FralRkWko2bktRcW5DR1RaM1RVcVRKT2dOZlYrZGlJOUpVbllGVFh4M1dyeFkxYmtnZGFVd25YeGdnQjZrS0o2bkxRYXJDU2VweWtLcHdrcm9jcENxY3BDNEhxUW9ucWN0QnFzSko2bktRcW5DU3VoeWtLcHlrTGdlcENpZXB5MEdxd2tucWNwQ3FjSks2SEtRcW5LUXVCNmtLSjZuTFFhckNTZXB5a0twd2tyb2NwQ3FjcEM0SHFRb25xY3RCcXNKSjZuS1FxbkNTdWh5a0tweWtMZ2VwQ2llcHkwR3F3a25xY3BDcWNKSzZIS1FxbktRdUI2a0tKNm5MUWFyQ1NlcHlrS3B3a3JvY3BDcWNwQzRIcVFvbnFjdEJxc0pKNm5LUXFuQ1N1aHlrS3B5a0xnZXBDdWYwcWJmRHp5MkYrTENxSTUxS21zZXEzcjR6VWtjNmtwUFU1U0JWNFNSMU9VaFZPRWxkRGxJVnpxeFNuelhSODk0T0FLa0taMTZwZTIrbjVyazJMaVYxVWpjaUpYVlNOeUlsZFZJM0lpVjFVamNpSlhWU055SWxkVkkzSWlYMUVWTnZ2Q2JmN1hVcU5RSHBrWkw2bUtsMzNVbkRBOVRwVmoyeExTVjFUNFdrbm91VTFEMFZrbm91VWxMM1ZFanF1VWhKM1ZNaHFlY2lKWFZQaGFTZWk1VFVQUldTZWk1U1VuODQySVMzVmxMWElTVjF6eUNwNXlJbGRjOGdxZWNpSlhYUElLbm5JaVYxenlDcDV5SWxkYzhncWVjaUpYWFBJS25uSWlWMXp5Q3A1eUlsZGM4Z3FlY2lKWFhQSUtubklpVjF6eUNwNXlJbGRjOGdxZWNpSlhYUFlPTll4MjhaSmZXVXBLVHVHUnkyMHUvZU1hbkhrcEs2WjVEVWM1RXFTSDM1b1NqMkw4dTdyOFhlZWZsb3M2RjlaNlNPZENSbjROU3ZEK3JOMllIN2VMVFowTDR6VWtjNmtqTnc2bWUvdVY5WFIvTnkrZWw4ZS9Qekp1MDdJM1drSXpuRHBuNzN4OXh0WE5oVjROc2I5eGV2S3RvTjA2UXUyUW5rVDRmbmZYWDBTL0Yydmp0MVIvdm5GYXM2MHBHY1lWZjE1Y2Q1dWZyOW5OVGwySmFtbjdyalNlT2tQZ1RiVWpXcGMxb3F4N1kwL2RTdjk4N0w1ZWRMTGpiS3NTMU5QL1Z5VWRTdkZxME9HelliMm5kRzZraEhjdktGQVMwN0p2VllVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpNVNVdmNNa25vdVVsTDNESko2TGxKUzl3eVNlaTVTVXZjTWtub3VVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpNVNVdmNNa25vdVVsTDNESko2TGxKUzl3eVNlaTVTVXZjTWtub3VVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpNVNVdmNNa25vdVVsTDNESko2TGxKUzl3eVNlaTVTVXZjTWtub3VVbEwzREpKNkxsSlM5d3lTZWk1U1V2Y01rbm91VWxMM0RKSjZMbEpTOXd5U2VpN1NQRkp2WjVyVUpUdUIvR0ZWSDd4YURNQzJOSTlWdlgxbnBJNTBKQ2VwdCt5WTFHTkpTZDB6U09xNVNFbmRNMGpxdVVoSjNUUFllYXlKeHAwRWVnZ0hZRnRLNnA3QjhCY2JBejJFQTdBdEpYWFBZUGpVbXhqd0VBN0F0cFRVUFlPVHZJUkU2aE5JU2QxWFllQXhVbzhsSlhWZmhZSEhTRDJXbE5SOUZRWWVJL1ZZVWxMM1ZSaDRqTlJqU1VuZFYySGdNVkx2SisxMndhcWZNeUNrM25jbkF4N0NBY1NTOXMvMVFlcWRIcTVBRXgxRDJocERmOXAzWmpEMTVyaWlwZDdwTGpkTFNYMmI5cDBwU0wwcmpYZXZpYWFka0hwNFNIMnNuVWp1SHFtUEFLbVB0UlBKM1F1ZWV2Zi83elROcHZVZmsvb3UybmRHNnB0L0xIaXlPeDhsZGI1aDY5MGo5VjIwNzR6VU4vOVlrcnBnMXQzdlh1ZXpqaUdRdW1lUTFQdnRwR0VzL09NNjZDNlF1dTloRFR4RzZnSEdCdDJGemIzdmZJYlJSOXAyaTdaSHBqL3RPeVAxelQ4MmwvcTRSMFFPVWg5cko1SzdaekgxME1JbmtQcFlPNUhjUFZLWEM1OUE2bVB0UkhZcHIyUHFvcDAwakpINnprZW1QMkh1c0lMVVJjTE9SSnRoMTdHdUlaTDZyaDFubm5vMlFsS1gzbUZTVnlJa2Rla2RKblVsd3ViRExzRXpUK3BqakNFY2F5ZUNaNTdVeHhoRE9OWk9CTTg4cVk4eGhuQ3NuUWllZVZJZll3emhXRHNSUFBOSnAzNzN0ZGc3di85VCs4NFNlMG9RanJNVDBhdHJDYWQrZHVBK2ZrTHFwb1RoZDlLWVRaZkxQT09udmpxYWw4dFA5OHM2cVpzU2h0OUo1LzhsVEorNnk5emx2b0hVVFFranpqcHE2cThxMm0vYy9Zcy9BSHJUTWRsSlZ2VStuNE1EUUtwRHF2UWI3a2dkYVFyTzFFNUwrMHhzQUVoMVNKV20zdXRpWTUrSkRRQ3BEcW5XMUZlSDNWOUM2ak94QVNEVklkV2EramJoSmpZQXBEcWtwQzRHcVE0cHFZdEJxa05LNm1LUTZwQ1N1aGlrT3FTa0xnYXBEaW1waTBHcVEwcnFZcERxa0pLNkdLUTZwS1F1QnFrT0thbUxRYXBEU3VwaWtPcVE1cEY2Vnp6ZnJwUVF6RFE0a1NkSzZqdGdwc0VoOVRSaHBzRWg5VFJocHNHeGxUcEFMRWdkakVEcVlBUlNCeU9RT2hpQjFNRUlVNmErL1pic0tWSy9pZE5tbXR1YnRGaCtLSXBqRFRPOUxvcTM4MFFtT21YcTIrK1NsQ0NyUS9jVWJLYTV2VW1LMWVGeGVWMGxsUHhNbHgvbjVYWDFtQ1l4MFFsVGYvVGVkK214S0g3ZHZCTmxOYzN0VGV5cGJYTzlmMWt0amNjS1pscldUM3NhRTUwdzlVZnZhSm9lM3kvZEZEZlQzTjdFbnRwVHFwVmR4MHdYKzVkcFRKVFVINklvOVdRS2FtZjU0ZTA4a1llVTFCK2lKL1hGbnBhWlZzZnFhVXlVMUIraUp2V0Z1NjZoWXFaUFoyZ2c5VlRQbXg3dzgxbUlmdzdWenFLK1dLZGhwalpQUzFPOEd2YUkraGxJNHNwWUsrNGFuaVA1bWJvTGpjdlBsMmxNZE1yVXQ5K1NQVVhxMURmVDNONGt4Vm5oT0ZZdzAwWFJNTU5JRStVTEE4QUlwQTVHSUhVd0FxbURFVWdkakVEcVlBUlNCeU9RT2hpQjFLTnlPbnZqTmovZXZTK3YzdGNidDkzbTZ0bVhDRFBMRDFLUHljMWYvdmI4ejdKT3ZjNTgvZHRITnlMMU1KQjZUQzZlLyt1MUs1dlVKNERVSTNKNzhyTDZLRjNmZjM4OW03MzR6N3YzTjV2dHB2bUwyZXpaUDEzcTFXL1d4em93RkZLUGlGdXZMMXpJbTFYOTRYLzFMNmZWNGMzVmJIT3JtOWUwTG9IVUkzTDY0bHRWOUp1ZHFkL1VSemVuejc3VU55cXY2dU42R0FpcHgyTzlUTHVWZTBmcTY3YXJ0WDk5dUw0dUh3WkM2dkZ3eDkrTzk3dFN2N2hQL2Y2V01CaFNqOGI2akxSSyttWEhWUjFFa0hvMGZ2Wjc0WTdGSDZYK3BqNWNXUit4clA4KzdseHpnTlNqNFU1S0hkVWhlNTM2bS92TWIwOWVmTHM5cVE1WDNJV1greXN3N3Z3MDhwUlZRK3F4K1A5SjV1bnpmN3NMaTV2cjZkWDIyNDkzczlrL25seFg1d0tNQ0ZJSEk1QTZHSUhVd1Fpa0RrWWdkVEFDcVlNUlNCMk1RT3BnQkZJSEk1QTZHT0Yvc3NyaUZFTUFrYm9BQUFBQVNVVk9SSzVDWUlJPVwiIC8+XG5cbjwhLS0gcm5iLXBsb3QtZW5kIC0tPlxuIn0= -->
<!-- rnb-plot-begin -->
<img src="data:image/png;base64,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" />
<!-- rnb-plot-end -->
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0dCQmMzQmxZM1FnS01Ld0tXQXBLU0FyWEc0Z0lHZGxiMjFmYUdsemRHOW5jbUZ0S0dacGJHd2dQU0JjSW5kb2FYUmxYQ0lzSUdOdmJHOXlJRDBnWENKaWJHRmphMXdpS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG5nZ3Bsb3QoZGJfcmVzdXJ2LCBhZXMoYEFzcGVjdCAowrApYCkpICtcbiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IFxcd2hpdGVcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
ggplot(db_resurv, aes(`Aspect (°)`)) +
geom_histogram(fill = \white\, color = \black\)
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVZR0JnY2x4dVoyZHdiRzkwS0dSaVgzSmxjM1Z5ZGl3Z1lXVnpLR0JCYzNCbFkzUWdLTUt3S1dBcEtTQXJYRzRnSUdkbGIyMWZhR2x6ZEc5bmNtRnRLR1pwYkd3Z1BTQmNYSGRvYVhSbFhGd3NJR052Ykc5eUlEMGdYRnhpYkdGamExeGNLVnh1WUdCZ1hHNWdZR0FpZlE9PSAtLT5cblxuYGBgclxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBBc3BlY3QgKMKwKWApKSArXG4gIGdlb21faGlzdG9ncmFtKGZpbGwgPSBcXHdoaXRlXFwsIGNvbG9yID0gXFxibGFja1xcKVxuYGBgXG5gYGBcblxuPCEtLSBybmItc291cmNlLWVuZCAtLT5cbiJ9 -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBBc3BlY3QgKMKwKWApKSArXG4gIGdlb21faGlzdG9ncmFtKGZpbGwgPSBcXHdoaXRlXFwsIGNvbG9yID0gXFxibGFja1xcKVxuYGBgXG5gYGAifQ== -->
```r
```r
ggplot(db_resurv, aes(`Aspect (°)`)) +
geom_histogram(fill = \white\, color = \black\)
```
```
<!-- rnb-source-end -->
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIGV5Sm9aV2xuYUhRaU9qUXhPUzQyTlRNNUxDSjNhV1IwYUNJNk5qYzVMQ0prY0draU9pMHhMQ0p6YVhwbFgySmxhR0YyYVc5eUlqb3dMQ0pqYjI1a2FYUnBiMjV6SWpwYld6QXNJbHgxTURBeFlsc3pPRHMxT3pJMU5XMWdjM1JoZEY5aWFXNG9LV0FnZFhOcGJtY2dZR0pwYm5NZ1BTQXpNR0F1SUZCcFkyc2dZbVYwZEdWeUlIWmhiSFZsSUhkcGRHZ2dZR0pwYm5kcFpIUm9ZQzVjZFRBd01XSmJNemx0SWwwc1d6RXNJbGRoY201cGJtYzZJRngxTURBeFlsc3pPRHMxT3pJMU5XMVNaVzF2ZG1Wa0lETTROVEF6TWlCeWIzZHpJR052Ym5SaGFXNXBibWNnYm05dUxXWnBibWwwWlNCdmRYUnphV1JsSUhSb1pTQnpZMkZzWlNCeVlXNW5aVnh1S0dCemRHRjBYMkpwYmlncFlDa3VYSFV3TURGaVd6TTViU0pkWFgwPSAtLT5cblxuPGltZyBzcmM9XFxkYXRhOmltYWdlL3BuZztiYXNlNjRcbiJ9 -->
```
<!-- rnb-plot-begin eyJoZWlnaHQiOjQxOS42NTM5LCJ3aWR0aCI6Njc5LCJkcGkiOi0xLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbWzAsIlx1MDAxYlszODs1OzI1NW1gc3RhdF9iaW4oKWAgdXNpbmcgYGJpbnMgPSAzMGAuIFBpY2sgYmV0dGVyIHZhbHVlIHdpdGggYGJpbndpZHRoYC5cdTAwMWJbMzltIl0sWzEsIldhcm5pbmc6IFx1MDAxYlszODs1OzI1NW1SZW1vdmVkIDM4NTAzMiByb3dzIGNvbnRhaW5pbmcgbm9uLWZpbml0ZSBvdXRzaWRlIHRoZSBzY2FsZSByYW5nZVxuKGBzdGF0X2JpbigpYCkuXHUwMDFiWzM5bSJdXX0= -->
<img src=\data:image/png;base64
```
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIC0tPlxuXG48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBdW9BQUFITkNBTUFBQUIvK0s2SEFBQUFzVkJNVkVVQUFBQUFBRG9BQUdZQU9wQUFacll6TXpNNkFBQTZBRG82a050TlRVMU5UVzVOVFk1TmJtNU5icXROanNobUFBQm1BRHBtQUdabVpqcG1rSkJtdHY5dVRVMXVUVzV1VFk1dWJxdHVqbzV1cStTT1RVMk9UVzZPYnF1T3lQK1FPZ0NRdHBDUTIvK3JiazJyYm82cjVQKzJaZ0MyMjVDMi8vL0lqazNJcTI3STVLdkkvLy9ia0RyYi8vL2txMjdreU1qay8vL3I2K3YvdG1iL3lJNy8yNUQvNUt2Ly83Yi8vOGovLzl2Ly8rVC8vLy85Rm90Z0FBQUFDWEJJV1hNQUFCQWxBQUFRSlFFdUQyMTRBQUFVSDBsRVFWUjRuTzJkRFh2VXVCVkd3eTZ3REJUWXR1elNGaG9LVGJwcHlhWnBRaEx3Ly85aHRTZnprY2tJNWNxUzN5dmI1MzJ5TzJHd2p1NlZUNFRIQ2NOQlE4Z3NjdUJkQUNHYW9EcVpTVkNkekNTb1RtWVNWQ2N6Q2FxVG1TUlg5ZjlaWXo5eVNzUlJGRG54dGxGZFFoeEZrUk52RzlVbHhGRVVPZkcyVVYxQ0hFV1JFMjhiMVNYRVVSUTU4YlpSWFVJY1JaRVRieHZWSmNSUkZEbnh0bEZkUWh4RmtSTnZHOVVseEZFVU9mRzJVVjFDSEVXUkUyOGIxU1hFVVJRNThiWlJYVUljUlpFVGJ4dlZKY1JSRkRueHRsRmRRaHhGa1JOdkc5VWx4RkVVT2ZHMlVWMUNIRVdSRTI4YjFTWEVVUlE1OGJaUlhVSWNSWkVUYnh2VkpjUlJGRG54dGxGZFFvd2pEMExKSXZZS3FxUDYwTWpRNHFONmFTS3FTNGlvN2s5RWRRa1IxZjJKcUM0aG9yby9FZFVsUkZUM0o2SzZoSWpxL2tSVWx4QlIzWitJNmhJaXF2c1RVVjFDUkhWL0lxcExpS2p1VDBSMUNSSFYvWW1vTGlHaXVqOFIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuMWhLZFpLUm9PcnlLdVlTZHZWQmllenEva1JVbHhCUjNaK0k2aElpcXZzVFVWMUNSSFYvSXFwTGlLanVUMFIxQ1JIVi9ZbW9MaUdpdWo4UjFTVkVWUGNub3JxRWlPcitSRlNYRUZIZG42aFJQZmhPYlErZVRHc0xoVGhERWxIZG55aFNQVFFFMWRkQmRRVVIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuNGpxRWlLcSt4TlJYVUpFZFg4aXFrdUlxTzVQUkhVSkVkWDlpYWd1SWFLNlB4SFZKVVJVOXllaXVvU0k2djVFVkpjUVVkMmZpT29TSXFyN0UxRmRRa1IxZnlLcVM0aW83azlFZFFrUjFmMkpxQzRob3JvL0VkVWxSRlQzSjZLNmhJanEva1JVbHhCUjNaK0k2aElpcXZzVFVWMUNSSFYvSXFwTGlLanVUMFIxQ1JIVi9ZbW9MaUdpdWo4UjFTVkVWUGNub3JxRWlPcitSRlNYRUZIZG40anFFaUtxK3hOUlhVSkVkWDhpcWt1SXFPNVBSSFVKRWRYOWlhZ3VJYUs2UHhIVkpVUlU5eWVhVlAvMmFiSDQyL0xoeGVmN0Q2aWVqMFIxQmRHaytzbkw4NnRmajVxVFY5M0h2UWRVejBlaXVvSm9VZjNtL2RINjRlcnQ1OTBIVkMrQVJIVUYwYUw2eXVqdW9SVjg5d0hWQ3lCUlhVRzBxSDc1OHQrTHhlSDNWWC9TSmpMOGUvVGNWOExUU1ZCMWVSVnpTVlQxOWpYcDVmTWpkdldoa096cUNxSko5WmZuemJkUGg2ZytGQkxWRlVTTDZwM1ZyZXE4TEIwS2llb0tva1gxNXFTOWdIbnhtWnVOUXlGUlhVRTBxZDU5Qyttd2FXN2VMYjlwdFB1QTZ2bElWRmNRVGFvYkVwOEYxVkhkbllqcUVpS3EreE5SWFVKRWRYOGlxa3VJcU81UFJIVUpFZFg5aWFndUlhSzZQeEhWSlVSVTl5ZWl1b1NJNnY1RVZKY1FVZDJmaU9vU0lxcjdFMUZkUWtSMWZ5S3FTNGlvN2s5RWRRa1IxZjJKcUM0aG9yby9FZFVsUkZUM0o2SzZoSWpxL2tSVWx4QlIzWitJNmhJaXF2c1RVVjFDUkhWL0lxcExpS2p1VDBSMUNSSFYvWW1vTGlHaXVqOFIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuNGpxRWlLcSt4TlJYVUpFZFg4aXFrdUlxTzVQUkhVSkVkWDlpYWd1SWFLNlB4SFZKVVJVOXllaXVvU0k2djVFVkpjUVVkMmZpT29TSXFyN0UxRmRRa1IxZnlLcVM0aW83azlFZFFrUjFmMkpxQzRob3JvL0VkVWxSRlQzSjZLNmhJanEva1JVbHhCUjNaK0k2aElpcXZzVFVWMUNSSFYvSXFwTGlLanVUeXlsZWp4aDFRZWRja3dKcWk2dllpNWhWeCtVeUs3dVQwUjFDUkhWL1ltb0xpR2l1ajhSMVNWRVZQY25vcnFFaU9yK1JGU1hFRkhkbjRqcUVpS3EreE5SWFVKRWRYOGlxa3VJcU81UFJIVUpFZFg5aWFndUlhSzZQeEhWSlVSVTl5ZWl1b1NJNnY1RVZKY1FVZDJmaU9vU0lxcjdFMUZkUWtSMWZ5S3FTNGlvN2s5RWRRa1IxZjJKcUM0aG9yby9FZFVsUkZUM0o2SzZoSWpxL2tSVWx4QlIzWitJNmhJaXF2c1RVVjFDUkhWL0lxcExpS2p1VDBSMUNSSFYvWW1vTGlHaXVqOFIxU1ZFVlBjbm9ycUVpT3IrUkZTWEVGSGRuNGpxRWlLcSt4TlJYVUpFZFg4aXFrdUlxTzVQUkhVSkVkWDlpYWd1SWFLNlB4SFZKVVJVOXllaXVvU0k2djVFVkpjUVVkMmZpT29TSXFyN0UxRmRRa1IxZnlLcVM0aW83azlFZFFrUjFmMkpxQzRob3JvL0VkVWxSRlQzSjZLNmhJanEva1JVbHhCUjNaOW9WUDNxN2VlbStmWnA4V0x2QWRYemthaXVJSVpVdi83NTQvTHg0b2ZmMWsrZGRGYWZ2T28rN2oyZ2VqNFMxUlhFbU9xbkc5VXYvOUR1Nmpmdmo3cmRmZmNCMVFzZ1VWMUIzRmY5K0dDVFo2dW52djN6UDYzVVY3ZTY3ejUwdi8ya1RjamxPK2ZOL09Rc0UxUmRYc1ZjRXRyVk56bjcyMVZNOVM3eEx5aDJkWFoxZDJKSTlmdTUrZnM1cWcrSlJIVUZNYWo2MXcrM0Z6Q3JhL1dUd3diVmgwU2l1b0lZVlAxNGUrdWwyOVRmTGJvYzhySjBLQ1NxSzRnaDFhOWZQN3UvOEV1cHVkazRFQkxWRmNTdzZtK0NxcmZiKzR1OUIxVFBSNks2Z2hoUy9ldUh4eUUxbzRuUGd1cW83azRNcWQ1Y0hPeHQ2NmcrSUJMVkZjU1E2dGV2RDNidXdLRDZ3RWhVVnhCRHF2ZEpmQlpVUjNWM0lxcExpS2p1VHd5cHpnVk1jU0txK3hORHFxOXlrV0E2cXVjZ1VWMUJqS2plSENmY2M0elBndXFvN2s2TXFaNnlyY2RuUVhWVWR5ZkdWRDlGZFEwUzFSWEVpT3JYcjdtQTBTQlJYVUVNcWI2K0EvUGo3Nmd1UWFLNmdoaFN2VS9pczZBNnFyc1RVVjFDUkhWL1lsajFMMC9iNjVkSEgvZldIOVVIUWFLNmdoaFUvV0w1WGdHbktUL2ZHSjhGMVZIZG5SaFMvZXVIMjcrRmRKcnd1alErQzZxanVqc3hwUHI2YnlIeExTUVJFdFVWeEpEcTdPckZpYWp1VHd5cHpyVjZjU0txK3hPRHFuTUhSb3RFZFFVeHJIcDY0ck9nT3FxN0UxRmRRa1IxZjJKWTllUDJCZW5Gd2Q0Ykg2SDZNRWhVVnhDRHFoOHZiNzN3azQwcUpLb3JpQ0hWdWE5ZW5JanEvc1NRNnB2NzZxaXVRYUs2Z2hoU2ZYVkgvY3ZUaEl2MStDeW9qdXJ1eEtEcTNGZlhJb3VyZmhCTVZvMzlVdE81Q2F1ZW52Z3NxQzVXdmRkNmwvL2lxZXJjb0xxRU9IN1YrNTNCbXM3TnB1cGVnbThUbndYVlViMVFVTDFvVUwwUXNhcHpzNm02bCtEYnhHZEJkVlF2RkZRdkdsUXZSS3pxM0d5cTdpWDROdkZaVUIzVkN3WFZpd2JWQ3hHck9qZWJxbnNKdmsxOEZsUkg5VUpCOWFKQjlVTEVxczdOcHVwZWdtOFRud1hWVWIxUVVMMW9VTDBRc2FwenM2bTZsK0RieEdkQmRWUXZGRlF2R2xRdlJLenEzR3lxN2lXNE5lR0ZHblRLTVNXb2VtbGdiVVMzc0tzUFNtUlhMeFgvWFQwK0M2cWplcUdnZXRHZ2VpRmlWZWRtVTNVdndiZUp6NExxcUY0b3FGNDBxRjZJV05XNTJWVGRTL0J0NHJPZ09xb1hDcW9YRGFvWElsWjFialpWOXhKOG0vZ3NxSTdxaFlMcVJZUHFoWWhWblp0TjFiMEUzeVkrUzJXcVAvU21KcWhlaUlqcTFvVXl0cEE4NHFGeVVMMFFFZFd0QzJWc0lYa0Vxb3VJcUc1ZEtHTUx5U05RWFVSRWRldENHVnRJSG9IcUlpS3FXeGZLMkVMeUNGUVhFVkhkdWxER0ZwSkhvTHFJaU9yV2hUSzJrRHdDMVVWRVZMY3VsTEdGNUJHb0xpS2l1bldoakMwa2owQjFFUkhWclF0bGJDRjVCS3FMaUtodVhTaGpDOGtqVUYxRVJIWHJRaGxiU0I2QjZpSWlxbHNYeXRoQzhnaFVGeEZSM2JwUXhoYVNSNkM2aUlqcTFvVXl0cEE4QXRWRlJGUzNMcFN4aGVRUnFDNGlvcnAxb1l3dEpJOUFkUkVSMWEwTFpXd2hlUVNxaTRpb2JsMG9Zd3ZKSTFCZFJFUjE2MElaVzBnZWdlb2lJcXBiRjhyWVF2SUlWQmNSVWQyNlVNWVdra2VndW9pSTZ0YUZNcmFRUEFMVlJVUlV0eTZVc1lYa0VhZ3VJcUs2ZGFHTUxTU1BRSFVSRWRXdEMyVnNJWGtFcW91SXFHNWRLR01MeVNOUVhVUkVkZXRDR1Z0SUhvSHFJaUtxV3hmSzJFTHlDRlFYRVZIZHVsREdGcEpIb0xxSWlPcldoVEsya0R3QzFVVkVWTGN1bExHRjVCR29MaUtpdW5XaGpDMGtqMEIxRVJIVnJRdGxiQ0Y1QktxTGlLaHVYU2hqQzhralVGMUVSSFhyUWhsYlNCNVJYdldIL25VbFZDK1ZnVlcvK21XeE9HeWFiNThXTHo3ZmYwQjFDeEhWUzJWWTFXL2VIVGFYejQrYWsxZmR4NzJIVmVLem9EcXFGOHF3cWwrK1BHLzM4TU9iOTBmTjFkdlB1dy9yWStLem9EcXFGOHJ3MStydHp0NkozUXErKzdEKy9mZ3NxSTdxaFRLODZtY3Z6NytyK3BNMjhkSGhoWHBneXVGU3ZwdzhZbEQxM3JWOGIzQmxSTGM4VVBWWit3cVVYYjAva1YyOVZJYmUxYy9hRjZXb25rR2N1ZW9QM1lwTnlNQ3FueTN2S3ZLeXREOXg3cXFYTy8zRHFuNzE2KzNtemMzRzNrUlVMM1g2aDFYOVpOSGxzTGw1dC95bTBlN0RLdkZaVUIzVkM1MStmakFnS2FndUlxSjZWcS83TFNTUFFIVVJFZFd6ZXQxdklYa0Vxb3VJcUo3VjYzNEx5U05RWFVSRTlheGU5MXRJSG9IcUlpS3FaL1c2MzBMeUNGUVhFVkU5cTlmOUZwSkhvTHFJaU9wWnZlNjNrRHdDMVVWRVZNL3FkYitGNUJHb0xpS2llbGF2K3kwa2owQjFFUkhWczNyZGJ5RjVCS3FMaUtpZTFldCtDOGtqVUYxRVJQV3NYdmRiU0I2QjZpSWlxbWYxdXQ5QzhnaFVGeEZSUGF2WC9SYVNSNkM2aUlqcVdiM3V0NUE4QXRWRlJGVFA2blcvaGVRUnFDNGlvbnBXcnl0aXp0L01SWFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSRWRXemVpMUFSSFVSY1REViszeGJaVE54cUpXRXhHZEJkVlF2ZFBxYjN1VnNEZ3VOVFVoOEZsUkg5VUtuSDlXVGlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLZ3VJcUo2VnE4RmlLTlYzZm85UWxRUGpWd2ZGaHFia1Bnc3FGNUlkZU9CcUI0YXVUNHNORFloOFZsUUhkWDducXdnRWRVTERVYjFRa1JVeitxMUFCSFZnMEYxVStLem9EcXE5ejFaUVNLcUZ4cU02b1dJcUo3VmF3RWlxZ2VENnFiRVowRjFWTzk3c29KRVQ5WGpDVmZtUnF5c25PQ0JabUxXWUhORURlWUFyVVIyZFhaMWRuVlQ0ck9nT3FyM1BWbEJJcW9YR296cWhZaW9udFZyQVNLcUI0UHFwc1JuUVhWVTczdXlna1JVTHpRWTFRc1JVVDJyMXdKRVZBOEcxVTJKejRMcXFONzNaQVdKcUY1b01Lb1hJcUo2VnE4RmlLZ2VES3FiRXA4RjFWRzk3OGtLRWxHOTBHQlVMMFJFOWF4ZUN4QlJQUmhVTnlVK0M2cWpldCtURlNTaWVxSEJBNm9lL3VjZXJMMmdPcXFuRVQxVkR4NW83U1Y0b1BGckI5VWpxNTJTK0N5b1BxRHF4dWZDWHhOMzZhaHVTbndXVks5QjlZZG1RWFZUNHJPZ09xcW5ENDRRSjZDNitSL3BRL1hvNEY2em9Mb3A4Vm5zcWhjL3NFODVxSjdlWURpby90M0tVRDNhUzNuVkIvNVRGTlcvVzlrWVZPOTFkNjlXMVIrcU8zTzlVZjI3bFkxQzlkRGdoOHBCZGRNc0QvOGhnK3FXWHMyRFViM1VlcWVxL3ZBc3FHN3AxVHk0Q3RXdDEwbW9iaXduMm5OQzRyT2dlcnJxT1FlaWVxaVdXTThKaWM4eVZ0V3p0bFpVUi9XOFhoTVA3Rk5PRXovUStOdzhWYmZ2RHYxbVFYVkxyK2JCcFZRMzM1VTBFeFdEODM1V011dDFONnJuSE5pbm5GS3F1eDJvS3NlOHRsbURkdzVCZFV1djVzR29ianpRdkxaWmczY09RWFZMcitiQnFHNDgwTHkyV1lOM0RrRjFTNjhQREhhN3NrYjFoTE02VHRYTmJ1VzhUTEtYWTN4dURBZWllaURSVmhKU2gxdldpTXB4TzlCenZjMUVzeWVGZHJwb0t3bXBRL1dxWnFIQitJSGxQVUYxcDFsb01INWcrVDl1VWQxcEZocE1QaERWU3g5WVdUazBXR2dXVkhlYWhRYVREMFQxMGdkV1ZnNE5GcG9GMVoxbW9jSGtBMUc5OUlHVmxVT0RoV1pCZGFkWmFERDV3RXBWLy9acDhlTHo1bGVvWHRPQmxaVXpkdFZQWG5VZjY2QjZUUWRXVnM3SVZiOTVmOVJjdmQxczY2aGUwNEdWbFROeTFUdk5POTFYUWZXYURxeXNuT21vL3FSTi9HRHpqeHdTMGo4MmM0ZmQxZTkrYlptUG5CSnhGRVZPdkcxVWx4QkhVZVRFMis2dGV0TEwwaUtsanBrNGlpSW4zblp2MVpOdU5oWXBkY3pFVVJRNThiYjdxMzd6enY0dHBDS2xqcGs0aWlJbjNuWi8xWGNqS0hYTXhGRVVPZkcyVVYxQ0hFV1JFMjhiMVNYRVVSUTU4YlpSWFVJY1JaRVRieHZWSmNSUkZEbnh0bEZkUWh4RmtSTnZHOVVseEZFVU9mRzJVVjFDSEVXUkUyOGIxU1hFVVJRNThiWlJYVUljUlpFVGJ4dlZKY1JSRkRueHRsRmRRaHhGa1JOdnU1VHE1anp3OTVXcXlCaHFwTWkrUWZVN0dVT05GTmszcUg0blk2aVJJdnNHMWU5a0REVlNaTi9JVkNmRU42aE9aaEpVSnpNSnFwT1pCTlhKVElMcVpDYlJxTDc3bnV6Vlpma1dUcXNhS3kzMTZwZkY0ckQySWk4WGkrZEgxUmFwVVgzM2JaSnF5ODI3N3BTc2FxeXoxSnQzaDgxbHExSFZSVjc5ZXRSY3RrdFphWkVTMWUrOStWMWxPVnY4ZGZVK2xHMk5sWlo2K2ZLODNTVVA2eTZ5UzF0YXJVVktWTC8zbHFhVjViL25YWDJyR2lzdXRkM1o2eS95N09WNXJVV2llbk5iWDYwbmFKdUtMVnJuNnBmblI5V3VKS28zSTFIOTdNVUlpdXl1MVdzdEV0V2JjYWgrMXQzYnFMM0k1azUxMVJYSnk5Sm0rNlZZNDR1cFZjNlc5KzBxTDdMaFpXbDE5NTN1WlhsR0tyMUZkcHZ1UGw2WHFvdnNialJlL2VXODFpSTFxdSsrSjN0MVdhcStxckhPVWs4V1hRN3JMckk1Vzl5dHJyWWkrY0VBTXBPZ09wbEpVSjNNSktoT1poSlVKek1KcXBPWkJOWEpUSUxxWkNaQmRYV09ENTRaajd4NHMvcms2NGMzemNYQndadm0rdWVQUTVVMS9hQzZPRjkrK3RNUHY1bU92SDY5VnYzMGNYUDl4OS9haitiaXg5K0hLMjNpUVhWeFRuLzQxOU0zRHgvVzNGRzkrMlNsZXJlL2szNUJkVzIrZm5qY2ZuU2ZmWGw2MEYyVGZQbnBIKzBueTJ1YTA0TTduenp1ZnY5MkQ3L28vaGhZWHNDMHY4VzIzamVvcnMzRm80L05hZnRmYS9xYnp0ODNyZEhkaFhqN2krN3BMMCtmM1g1eS9mclpabGMvZnJ3N252UUtxbXR6M083S3JjYXJyYnBwYnVYdU51dmxzOTNUdDU5c0wyRFd2MTRkemhWTXo2QzZOTGRpSDdlYVg3KytkZjNXM1hhenZ0MnYyMSt1YmQ2cWZzZnVIZTlKU2xCZG11NHEvR0I1amQ1ZXRhK3UxVHZETzlYWHYzWDd6RmJ4blkwYzFYc0gxWlZadlNLOWZyMjYrajUrOUhHcit2b3FuRjE5bUtDNk1tdWRUeDl0TnU3VkpVMTNyYjY1dDhpMStoQkJkV1dPVjdjS1c3K1gxcmYvKy9LMC9XUnpCNmJiNTVlZnRQdi9Sbkh1d0JRSnFndXozWkxiRjZiZHRmbnk5dUtmbjk3ZU1sOWV5QzlmcXk3dnEzYy9RbkRudnZvcTNGZnZIVlIzanVHSzVNN0YrczUxTzBrS3FqdkhjdkY5dXJtQzRXZGcrZ2ZWbldOUmZmT1RML3hrWTBaUW5jd2txRTVtRWxRbk13bXFrNWtFMWNsTWd1cGtKa0YxTXBQOEgzZmFDaEZmWk1kZkFBQUFBRWxGVGtTdVFtQ0NcIiAvPlxuXG48IS0tIHJuYi1wbG90LWVuZCAtLT5cbiJ9 -->
<!-- rnb-plot-begin -->
<img src="data:image/png;base64,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" />
<!-- rnb-plot-end -->
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaMmR3Ykc5MEtHUmlYM0psYzNWeWRpd2dZV1Z6S0dCVGJHOXdaU0Fvd3JBcFlDa3BJQ3RjYmlBZ1oyVnZiVjlvYVhOMGIyZHlZVzBvWm1sc2JDQTlJRndpZDJocGRHVmNJaXdnWTI5c2IzSWdQU0JjSW1Kc1lXTnJYQ0lwWEc1blozTmhkbVVvWm1sc1pXNWhiV1U5YUdWeVpTaGNJbTkxZEhCMWRGd2lMQ0JjSW1acFozVnlaWE5jSWl4Y0ltbHpjM1ZsT0M1MGFXWm1YQ0lwTEZ4dUlDQWdJQ0FnSUhkcFpIUm9QVEU0TEdobGFXZG9kRDB4TUN4MWJtbDBjejFjSW1OdFhDSXNaSEJwUFRNd01DbGNibUJnWUNKOSAtLT5cblxuYGBgclxuZ2dwbG90KGRiX3Jlc3VydiwgYWVzKGBTbG9wZSAowrApYCkpICtcbiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IFxcd2hpdGVcXCwgY29sb3IgPSBcXGJsYWNrXFwpXG5nZ3NhdmUoZmlsZW5hbWU9aGVyZShcXG91dHB1dFxcLCBcXGZpZ3VyZXNcXCxcXGlzc3VlOC50aWZmXFwpLFxuICAgICAgIHdpZHRoPTE4LGhlaWdodD0xMCx1bml0cz1cXGNtXFwsZHBpPTMwMClcbmBgYFxuXG48IS0tIHJuYi1zb3VyY2UtZW5kIC0tPlxuIn0= -->
ggplot(db_resurv, aes(`Slope (°)`)) +
geom_histogram(fill = \white\, color = \black\)
ggsave(filename=here(\output\, \figures\,\issue8.tiff\),
width=18,height=10,units=\cm\,dpi=300)
````
```r
ggplot(db_resurv, aes(`Slope (°)`)) +
geom_histogram(fill = \white\, color = \black\)
ggsave(filename=here(\output\, \figures\,\issue8.tiff\),
width=18,height=10,units=\cm\,dpi=300)
<!-- rnb-source-end -->
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIGV5Sm9aV2xuYUhRaU9qUXhPUzQyTlRNNUxDSjNhV1IwYUNJNk5qYzVMQ0prY0draU9pMHhMQ0p6YVhwbFgySmxhR0YyYVc5eUlqb3dMQ0pqYjI1a2FYUnBiMjV6SWpwYld6QXNJbHgxTURBeFlsc3pPRHMxT3pJMU5XMWdjM1JoZEY5aWFXNG9LV0FnZFhOcGJtY2dZR0pwYm5NZ1BTQXpNR0F1SUZCcFkyc2dZbVYwZEdWeUlIWmhiSFZsSUhkcGRHZ2dZR0pwYm5kcFpIUm9ZQzVjZFRBd01XSmJNemx0SWwwc1d6RXNJbGRoY201cGJtYzZJRngxTURBeFlsc3pPRHMxT3pJMU5XMVNaVzF2ZG1Wa0lETTVNVE00T0NCeWIzZHpJR052Ym5SaGFXNXBibWNnYm05dUxXWnBibWwwWlNCdmRYUnphV1JsSUhSb1pTQnpZMkZzWlNCeVlXNW5aVnh1S0dCemRHRjBYMkpwYmlncFlDa3VYSFV3TURGaVd6TTViU0pkWFgwPSAtLT5cblxuPGltZyBzcmM9XFxkYXRhOmltYWdlL3BuZztiYXNlNjRcbiJ9 -->
<img src=:image/png;base64
<!-- rnb-output-end -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIC0tPlxuXG48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBdW9BQUFITkNBTUFBQUIvK0s2SEFBQUFwVkJNVkVVQUFBQUFBRG9BQUdZQU9wQUFacll6TXpNNkFBQTZBRG82a050TlRVMU5UVzVOVFk1TmJxdE5qc2htQUFCbUFEcG1BR1pta0pCbXR2OXVUVTF1VFc1dVRZNXViazF1YnF0dWpvNXVxK1NPVFUyT1RXNk9UWTZPeVArUU9nQ1F0cENRMi8rcmJrMnJibTZyNVArMlpnQzIvLy9JamszSS8vL2JrRHJiLy8va3EyN2t5TWprLy8vcjYrdi90bWIveUk3LzI1RC81S3YvLzdiLy84ai8vOXYvLytULy8vOGNJbmVIQUFBQUNYQklXWE1BQUJBbEFBQVFKUUV1RDIxNEFBQVQvRWxFUVZSNG5PMmRDM3NUUnhKRmxZU1FpRmQyeVdzeE1RdVJzVm12MThZSTV2Ly90TldNWkFVVHVaaFNsM3R1cWMvOStDTGpTS2R1VHg4bW83RnhaaDBoVFdRMmRRRkM2Z1RWU1NOQmRkSklVSjAwRWxRbmpRVFZTU01wVmYxL1l6UCttY0R1QlNaYzdYNWhxTjRhVExnYXFnT0xoQWxYUTNWZ2tURGhhcWdPTEJJbVhBM1ZnVVhDaEt1aE9yQkltSEExVkFjV0NST3VodXJBSW1IQzFWQWRXQ1JNdUJxcUE0dUVDVmREZFdDUk1PRnFxQTRzRWlaY0RkV0JSY0tFcTZFNnNFaVljRFZVQnhZSkU2Nkc2c0FpWWNMVlVCMVlKRXk0R3FvRGk0UUpWenNFMVdjN2N3L0xBVmFabGdoV1NmVmRMMEgxU1dEQzFWRGRzUnhnbFdtSllLamVHa3k0R3FvN2xnT3NNaTBSRE5WYmd3bFhRM1hIY29CVnBpV0NSYWx1WjdmcTl6cVNrTjNock40S1RMaGFqck82UFJiVmRXREMxVkRkc1J4Z2xXbUpZS2plR2t5NEdxbzdsZ09zTWkwUkROVmJnd2xYUTNYSGNvQlZwaVdDb1hwck1PRnFxTzVZRHJES3RFUXdWRzhOSmx3TjFSM0xBVmFabGdpRzZxM0JoS3VodW1NNXdDclRFc0ZRdlRXWWNEVlVkeXdIV0dWYUloaXF0d1lUcm9icWp1VUFxMHhMQkVQMTFtREMxVkRkc1J4Z2xXbUpZS2plR2t5NEdxbzdsZ09zTWkwUkROVmJnd2xYUTNYSGNvQlZwaVdDb1hwck1PRnFxTzVZRHJES3RFUXdWRzhOSmx3TjFSM0xBVmFabGdpRzZxM0JoS3VodW1NNXdDclRFc0ZRdlRXWWNEVlVkeXdIV0dWYUloaXF0d1lUcm9icWp1VUFxMHhMQkVQMTFtREMxVkRkc1J4Z2xXbUpZS2plR2t5NEdxbzdsZ09zTWkwUkROVmJnd2xYUTNYSGNvQlZwaVdDb1hwck1PRnFxTzVZRHJES3RFUXdWRzhOSmx3TjFSM0xBVmFabGdpRzZxM0JoS3VodW1NNXdDclRFc0ZRdlRXWWNEVlVkeXdIV0dWYUl0Z1kxYS9tZlY1MDF6L1A1MDh1dWs5djVvL1B1cHNIVkU4R0U2NDJ2ZXFEN2l1dHI1NE9INTQrN1gvZFBLQjZNcGh3TlFuVmwwZkhLN2xmREIrK1hIVFh2NTV0SGxBOUcweTRtb1RxNS8yRnk1K0wvc1BlNzVYbm00ZitNOSt2WXI5OHQrcjJhd2k1bDlqZWZYcHozSi9PZjVzL1d1eFF2WS85SjR5enVnNU11SnJDV1gyNFVybitaZEV0L3poRDlkd3c0V29LcXAvZnZQLzh5M0ZVVHdvVHJxYWcrdm9ONlZwMTNwYm1oZ2xYRTFCOXVGUWY3amRlLzM3QnpjYmNNT0ZxQXFwdkxsVE81OE1YalpaSG56K2dlaktZY0RVQjFVZkVIb3ZxT2pEaGFxanVXQTZ3eXJSRU1GUnZEU1pjRGRVZHl3RldtWllJaHVxdHdZU3JvYnBqT2NBcTB4TEJVTDAxbUhBMVZIY3NCMWhsV2lJWXFyY0dFNjZHNm83bEFLdE1Td1JEOWRaZ3d0VlEzYkVjWUpWcGlXQ28zaHBNdUJxcU81WURyREl0RVF6Vlc0TUpWME4xeDNLQVZhWWxncUY2YXpEaGFxanVXQTZ3eXJSRU1GUnZEU1pjRGRVZHl3RldtWllJaHVxdHdZU3JvYnBqT2NBcTB4TEJVTDAxbUhBMVZIY3NCMWhsV2lJWXFyY0dFNjZHNm83bEFLdE1Td1JEOWRaZ3d0VlEzYkVjWUpWcGlXQ28zaHBNdUJxcU81WURyREl0RVF6Vlc0TUpWME4xeDNLQVZhWWxncUY2YXpEaGFxanVXQTZ3eXJSRU1GUnZEU1pjRGRVZHl3RldtWllJaHVxdHdZU3JvYnBqT2NBcTB4TEJVTDAxbUhBMVZIY3NCMWhsV2lJWXFyY0dFNjZHNm83bEFLdE1Td1JEOWRaZ3d0VlEzYkVjWUpWcGlXQ28zaHBNdUZvTzFlM3NWdjFlUnhLeU81elZXNEVKVjh0eFZyZkhvcm9PVExnYXFqdVdBNnd5TFJFTTFWdURDVmREZGNkeWdGV21KWUtoZW1zdzRXcW83bGdPc01xMFJEQlVidzBtWEEzVkhjc0JWcG1XQ0licXJjR0VxNkc2WXpuQUt0TVN3VkM5Tlpod05WUjNMQWRZWlZvaUdLcTNCaE91aHVxTzVRQ3JURXNFUS9YV1lNTFZVTjJ4SEdDVmFZbGdxTjRhVExnYXFqdVdBNnd5TFJFTTFWdURDVmREZGNkeWdGV21KWUtoZW1zdzRXcW83bGdPc01xMFJEQlVidzBtWEEzVkhjc0JWcG1XQ0licXJjR0VxNkc2WXpuQUt0TVN3VkM5Tlpod05WUjNMQWRZWlZvaUdLcTNCaE91aHVxTzVRQ3JURXNFUS9YV1lNTFZVTjJ4SEdDVmFZbGdxTjRhVExnYXFqdVdBNnd5TFJFTTFWdURDVmREZGNkeWdGV21KWUtoZW1zdzRXcW83bGdPc01xMFJEQlVidzBtWEEzVkhjc0JWcG1XQ0licXJjR0VxNkc2WXpuQUt0TVN3VkM5Tlpod05WUjNMQWRZWlZvaUdLcTNCaE91aHVxTzVRQ3JURXNFRzZYNjljL3orWk9MN3RPYitlT3o3b3NIVkU4R0U2NG1vUHJWMCtIaDlHbi82NHNIVkU4R0U2NG1vUHJwaS82Znk1ZUw3dnJYczlzUHFKNE5KbHh0ZXRVLy9ibm9IM3F4VjRMZmZ1ai94ZmVyV0g5UzdxQ1h2ajBnWko5WTNpMWYvalovdExoYjlUNzJuekRPNmpvdzRXclRuOVd2ZjFsMHl6L09VUDBnWU1MVjZxdis0YWZYdytQbHQyOC9PN012VVAwZ1lNTFZwbFA5M1czVmVWdDZFRERoYXJWVlA1bHQ4K1A2TTFlUHo3cnIzeSs0MlhnUU1PRnEwNTNWdHptZkQxOHRXaDd0ZUVEMVpERGhhdE8vTFIwVGV5eXE2OENFcTAyZytzZFg2d3VZejY3VlVmMVFZTUxWSmxEOXhPRTRxaWVEQ1ZlYjRGcjkyWTllMDFFOURVeTQyaFNxUDBmMWc0VUpWNnV2K3NkWEQxRDlZR0hDMVNhNFZyK2N1VS9yOWxoVTE0RUpWNXZpQW1iR0haaURoUWxYNDc2Nll6bkFLdE1Td1ZDOU5aaHdOUzVnSE1zQlZwbVdDTFpMOVUwdVBWOUlzc2VpdWc1TXVOcDBGekFuam51TzlsaFUxNEVKVjV0T2RjOXAzUjZMNmpvdzRXclRxZjRPMVE4UUpseHRNdFUvUE9NQzVnQmh3dFdtdXdQejNYOVEvZkJnd3RXNHIrNVlEckRLdEVRd1ZHOE5KbHh0Q3RYZlAxeGR2M3p6K205Mm9ucCttSEMxU2I2enNmKzdHZTg4Mzk5b2owVjFIWmh3dGZxcWYzeTEvbHRJN3h6dlMrMnhxSzRERTY0MnhSMlk5ZW1jTHlFZElreTRHbWQxeDNLQVZhWWxndTFTbld2MVE0WUpWMnZxRHN4c1o4WXZweVNOd0lTck5YVmYzWG42VDNTZ1pXREMxVkFkMVNOaHd0V21VUDFrOVliMGN1YjV3VWYyV0ZUWGdRbFhtMEQxaytIV3l4VGYyWWpxOXc0VHJ0YlVmWFZVdjNlWWNMVUo3NnVqK2dIQ2hLdE5jQUd6dnFQKy9xSGpZdDBlaStvNk1PRnFiZDFYUi9YN2hnbFg0MllqcWtmQ2hLdWhPcXBId29Tcm9UcXFSOEtFcTZFNnFrZkNoS3VoT3FwSHdvU3JvVHFxUjhLRXE2RTZxa2ZDaEt1aE9xcEh3b1Nyb1RxcVI4S0VxNkU2cWtmQ2hLdWhPcXBId29TcjVWRGR6bTZEUzU1SXlKN2hyTjRLVExoYWpyTzZQUmJWZFdEQzFWQWQxU05od3RWUUhkVWpZY0xWVUIzVkkySEMxVkFkMVNOaHd0VlFIZFVqWWNMVlVCM1ZJMkhDMVZBZDFTTmh3dFZRSGRValljTFZVQjNWSTJIQzFWQWQxU05od3RWUUhkVWpZY0xWVUIzVkkySEMxUTVYOVYxQjlmdUdDVmM3WE5WSGZnN1ZVVDBDaHVxdHdZU3JvVHFxUjhLRXE2RTZxa2ZDaEt1aE9xcEh3b1Nyb1RxcVI4S0VxNkU2cWtmQ2hLdWgrdDMvTS9aRUIxb0dKbHdOMVhjK3NjS3hPVXlZY0RWVVIvVkltSEExVkVmMVNKaHdOVlJIOVVpWWNEVlVSL1ZJbUhBMVZFZjFTSmh3TlZSSDlVaVljRFZVUi9WSW1IQTFWRWYxU0pod05WUWZyZnJkWDFiZDY5aVVSQmNtWEEzVng2dCs1eFAzT2pZbDBZVUpWME4xVkkrRUNWZERkVlNQaEFsWFEzVlVqNFFKVjBOMVZJK0VDVmREZFZTUGhBbFhRM1ZVajRRSlYwTjFWSStFQ1ZkRGRWU1BoQWxYUTNWVWo0UUpWME4xVkkrRUNWZERkVlNQaEFsWFEzVlVqNFFKVjBOMVZJK0VDVmNUVVAzNjUvbjhlUDN3NUtMNzlHYisrS3k3ZVVEMVpERGhhdE9ydmp3NjdxNGVMYnFycDhOdlQ1LzJ2MjRlVUQwWlRMamE5S3BmRGFmeTQrNzBSZis3NWN0RmQvM3IyZVlCMWJQQmhLdE5yL29nK05IeHB6OFgvVWU5M3l2UE53LzlaNzVmeFg3MVBhaGU5RVRTY0w1bXhQbVRpK1hMMythUEZqdFU3MlAvQ2VPc3JnTVRyaVp4Vmo5ZnZRTzkvbVhSTGY4NFEvWGNNT0ZxQ3FxZlA5bzQvWmZqcUo0VUpseE5RUFh6N1YzRmxkeThMYzBORTY0MnZlcjlsY3NxVi8xRnpPOFgzR3pNRFJPdU5yM3FwL00reDkzNWZQaWkwZkxvOHdkVVR3WVRyamE5Nm1OaWowVjFIWmh3TlZSSDlVaVljRFZVUi9WSW1IQTFWRWYxU0pod05WUkg5VWlZY0RWVVIvVkltSEExVkVmMVNKaHdOVlJIOVVpWWNEVlVSL1ZJbUhBMVZDOVRmZlQvU1NQUnJ1blFFc0ZNeHh5eHgwNnArcDB2L3VxeEtZa3VUTGdhcXFONkpFeTRHcXFqZWlSTXVCcXFvM29rVExnYXFxTjZKRXk0R3FxamVpUk11QnFxbzNva1RMZ2FxcU42SkV5NEdxcWplaVJNdUJxcW8zb2tUTGdhcXFONkpFeTRHcXFqZWlSTXVCcXFvM29rVExnYXFxTjZKRXk0R3FxamVpUk11QnFxbzNva1RMZ2FxcU42SkV5NEdxcWplaVJNdUJxcTExRjk1OS9NRy8vWDliNTJvRXVDNmhFdzB6Rkg3TEVwVkI5ZFo2OERYUkpVajRDWm0rcUlQUmJWaTRMcUVUQnpVeDJ4eDZKNlVWQTlBbVp1cWlQMldGUXZDcXBId014TmRjUWVpK3BGUWZVSW1MbXBqdGhqVWIwb3FCNEJNemZWRVhzc3FoY0YxU05nNXFZNllvOUY5YUtnZWdUTTNGUkg3TEdvWGhSVWo0Q1ptK3FJUFJiVmk0THFFVEJ6VXgyeHg2SjZVVkE5QW1adXFpUDJXRlF2Q3FwSHdNeE5kY1FlaStwRlFmVUltTG1wanRoalViMG9xQjRCTXpmVkVYc3NxaGNGMVNOZzVxWTZZbzlGOWFLZ2VnVE0zTlN3M0lQcUpVK01uMEx5aExNNlovVURoNW1iNm9nOUZ0V0xndW9STUhOVEhiSEgzb1BxT3pQMnhXTTdvdm9Cd2N4TmRjUWVxM2F0UHJZanFoOFF6TnhVUit5eEI2LzYvajlhWUV4UVBRSm1icW9qOXRqRFYzM3NFL2NLcWtmQXpFMTF4QjZMNmtWQjlRaVl1YW1PMkdOUnZTaW9IZ0V6TjlVUmV5eXFGd1hWSTJEbXBqcGlqMjFVOWFpM3FxZ2VBVE0zMVJGN2JLT3FqeDN0M3JXaUpMSXpGR1p1cWlQMldGUTNSN3QzclNpSjdBeUZtWnZxaUQwVzFjM1I3bDByU2lJN1EySG1wanBpajBWMWM3UjcxNHFTeU01UW1MbXBqdGhqVWQwYzdkNjFvaVN5TXhSbWJxb2o5bGhVTjBlN2Q2MG9pZXdNaFptYjZvZzlGdFhOMGU1ZEswb2lPME5oNXFZNllvOUZkWE8wZTllS2tzak9VSmk1cVk3WVkxSGRITzNldGFJa3NqTVVabTZxSS9aWVZEZEh1M2V0S0luc0RJV1ptK3FJUFJiVnpkSHVYU3RLSWp0RFllYW1PbUtQUlhWenRIdlhpcExJemxDWXVhbU8yR05SM1J6dDNyV2lKTEl6RkdadXFpUDJXRlEzUjd0M3JTaUo3QXlGbVp2cWlEMVdUZldTSHplQTZrbGg1cVk2WW85VlU3MXNTdEVDUTNhdEtJbnNESVdabStxSVBSYlZyUmY3ZDYwb2lld01oWm1iNm9nOUZ0V3RGL3QzclNpSjdBeUZtWnZxaUQwVzFhMFgrM2V0S0luc0RJV1ptK3FJUFJiVnJSZjdkNjBvaWV3TWhabWI2b2c5RnRXdEYrLysyV0RXcmhVbGtaMmhNSE5USGJISG9ycjE0dDIzOUsxZEswb2lPME5oNXFZNllvOUZkZXZGcUY0RlptNnFJL1pZVkxkZWpPcFZZT2FtT21LUFBTelZSMzZwRmRXMVlPYW1PbUtQUFN6Vmk1NDQ5dkNnZWpUTTNDdEg3TEdvdnYzYzJNT0Q2dEV3YzY4Y3NjZWkrdlp6WXc4UHFrZkR6TDF5eEI2TDZ0dlBqVDA4OS9mLzRSQzJNM0xScUY1dlNxSHFPNG43N2ZwWEhOQ0JSUzRhMWV0TlFYVTNETldqbjRqcVlVSDFMNExxMjgrTlBUeW9YcmhvVks4M3BVM1ZTOTVab2pxcW02OHVkaUFVVnRJYjFWSGRmSFd4QTZHd1ExVDkwNXY1NDdQdDcreXhxTDc5WFBnUEt5aDNJQlIyaUtxZlB1MS8zY1FlaStwQlQ5eHYxNy9pd045MnkzRzF2Yi9xNDc5cnpydkFPNXFaUjliSzh1V2l1LzUxZTFxM3g0b3BJMWFuVFBYZC81MHdiUDI2NmlNbjc0U043MTJ5NkJHSlU3M1h2TmQ5RTN1c21ESmlkUXBWOTc3NDg3MGFmejAxVnFqRFZ2MzdWZXduanovekVMSnZScHA3djJkMTZ3OWJTWUJOVFVzRVEvWFdZTUxWUkZWM3ZTMnR0aHhnbFdtSllIdXI3cnJaV0cwNXdDclRFc0gyVjMxNU5QNUxTTldXQTZ3eUxSRnNmOVZ2UjJRNXdDclRFc0ZRdlRXWWNEVlVCeFlKRTY2RzZzQWlZY0xWVUIxWUpFeTRHcW9EaTRRSlYwTjFZSkV3NFdxb0Rpd1NKbHdOMVlGRndvU3JvVHF3U0pod05WUUhGZ2tUcm9icXdDSmh3dFZ5cUQ0NlgvbjdTaE9HWm50RXQ5cWR6VkNkWnZ0RXR4cXEzeDJhN1JIZGFxaCtkMmkyUjNTclRhODZJZE1HMVVralFYWFNTRkNkTkJKVUo0MEUxVWtqcWFQNjdaL0pMcFBybitmejQvWERrNHVweTl6S3BwTGdjYnVhOTNtaGQ5Q0duOE8xT1dBN2oxc2QxVy8vbUNTVkxJK091NnRIaSs1S3I5cW1rdVp4NjY1V0hxa2R0T1ZSTC9mbWdPMDhibFZVLytLSDM2bmthamh2SG5lbkw2WnU4cmVzSzRrZXQvNFVvWGJRenVmLzJ2d3cwZFVCMjMzY3Fxait4WTgwVmNwcTJ6NzlLZGRzVTBuMHVKMzNwd2l4Zy9iZmkvNWdiUTdZN3VQV3V1cXJiVnUrL0czK1NLdmNwcExtY2V2L1E5anBIVFJVdDNPK3VzQzcvbVhSTGYrUXVrellWTkk4YnNPbGdkNUJRM1V6NXpjbkpzRjJkMjdaMURtL2VjT25WVTFEZGRHM1Y4TTVmUjJ0WFJ1eXFxUjUzTFp2U0xVTzJyWEUyMUxSbTJiOWY0Uzc5YTJ6NjkrVmJoRnZLeWtldCtGU1hmQ2dEVzVQZnJQeGk1L0pycExUNGFzaHg5MzVYSzdkcHBMaWNkdWN5K1VPMnFENjVvRHRQRzU4WXdCcEpLaE9HZ21xazBhQzZxU1JvRHBwSktoT0dnbXFrMGFDNnFTUm9IcjlmSGcybTgyK2ZkdC84UHlyVC83NDZubDNPWnM5N3o3ODlMcEN0d01PcWxmUDVhd1gvT1NiMTZOVWYvZWcrL0NQdDZ0ZjNlVjMvN24vY2djY1ZLK2Vrd2Y5UHorK2VqQkc5ZjRwRzlYNzh6dlpQNmhlTzczam13eXFyNjVPWmo5MjNmc2YvdjF3K0dCMUlwOXRQbGpsc3IvUUdTNWdWcC9udEY0U1ZLK2V5OW1ONjczcS9lWE1oMmNQdXZjUFordmZkTzlXbHpidkgyNWNQM253MlF1LzRXcTlJS2hlUHl1cmgzZWx2ZW9mWC9WT3J5UmV5NzA2Y1g5NE5ueG1lRUszL3MzMmRWekJGQVRWSjhuSFY3UDEyOUsxdnF0L3JqOVlPYjgrZDIrMHZuVTFmOHQ3NGcycVQ1V1RiOTl1VmU4LytLRTN2RmQ5dHM3ZytLMFRPYW9YQmRWcjU4YmVsZFczenVwYjFUKy9JdWVzSGhkVXI1MmJPekNYdzFuOWkydjFrLzVhL1M2N3VWWXZDcXBYeitXc3YybDRPZnZ4aXpzd3E3UDU5ZzdNOEJXbVB0eUJDUXVxMTgvd2pRRzl0cmZ1cXovODU4UE5CZnE3emZjTjlMbTgrYURqdm5waFVGMGtkMXlkZkhZNU0rYmJDTWpkUVhXUjNIVWgvbTU3QmNQM3dKUUYxVVZ5bCtyYjczemhPeHNMZytxa2thQTZhU1NvVGhvSnFwTkdndXFra2FBNmFTU29UaHJKL3dITFh2RVhaSXVWMUFBQUFBQkpSVTVFcmtKZ2dnPT1cIiAvPlxuXG48IS0tIHJuYi1wbG90LWVuZCAtLT5cbiJ9 -->
<!-- rnb-plot-begin -->
<img src="data:image/png;base64,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" />
<!-- rnb-plot-end -->
<!-- rnb-output-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
# Add columns date and year
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVaR0pmY21WemRYSjJJRHd0SUdSaVgzSmxjM1Z5ZGlBbFBpVmNiaUFnYlhWMFlYUmxLR1JoZEdVZ1BTQmtiWGtvWUVSaGRHVWdiMllnY21WamIzSmthVzVuWUNrc0lIbGxZWElnUFNCNVpXRnlLR1JoZEdVcEtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiVcbiAgbXV0YXRlKGRhdGUgPSBkbXkoYERhdGUgb2YgcmVjb3JkaW5nYCksIHllYXIgPSB5ZWFyKGRhdGUpKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGJfcmVzdXJ2IDwtIGRiX3Jlc3VydiAlPiVcbiAgbXV0YXRlKGRhdGUgPSBkbXkoYERhdGUgb2YgcmVjb3JkaW5nYCksIHllYXIgPSB5ZWFyKGRhdGUpKVxuYGBgIn0= -->
```r
db_resurv <- db_resurv %>%
mutate(date = dmy(`Date of recording`), year = year(date))
Histograms:
ggplot(db_resurv, aes(year)) + geom_histogram(fill = "white", color = "black")
ggplot(db_resurv, aes(`Relevé area (m²)`)) +
geom_histogram(fill = "white", color = "black")
Observations with no info on plot size:
nrow(db_resurv %>% filter(is.na(`Relevé area (m²)`)))
[1] 19599
db_resurv %>%
pivot_longer(cols = c(`Cover total (%)`, `Cover tree layer (%)`,
`Cover shrub layer (%)`, `Cover herb layer (%)`,
`Cover moss layer (%)`),
names_to = "variable", values_to = "value") %>%
ggplot(aes(x = value)) +
geom_histogram(fill = "white", color = "black", bins = 10) +
facet_wrap(~ variable, scales = "free") +
labs(x = "Value", y = "Frequency")
db_resurv %>%
reframe(across(c(`Cover total (%)`, `Cover tree layer (%)`,
`Cover shrub layer (%)`, `Cover herb layer (%)`,
`Cover moss layer (%)`), ~range(., na.rm = TRUE)))
All values OK.
ggplot(db_resurv, aes(`Mosses identified (Y/N)`)) + geom_bar()
ggplot(db_resurv, aes(`Lichens identified (Y/N)`)) + geom_bar()
NA in most cases.
db_Europa<- db_resurv %>%
group_by(RS_CODE, `ReSurvey site`,
# If ReSurvey plot is not NA,
# group by RS_CODE, `ReSurvey site`, `ReSurvey plot`
`ReSurvey plot` = ifelse(is.na(`ReSurvey plot`),
NA_character_, `ReSurvey plot`),
# If ReSurvey plot is NA, group by coordinates
# Create a unique grouping variable that uses coordinates
# only when conditions are met
group_coords = ifelse(is.na(`ReSurvey plot`),
paste(Lon_updated, Lat_updated), NA_character_)
) %>%
# Add unique identifiers for each plot.
# These are based on the unique combination of RS_CODE, ReSurvey site and
# ReSurvey plot (When ReSurvey plot is not NA)
# and on the unique combination of RS_CODE, ReSurvey site
# and updated coordinates (When ReSurvey plot is NA)
mutate(plot_unique_id = cur_group_id()) %>%
select(PlotObservationID, Country, `Date of recording`, RS_CODE,
`ReSurvey site`, `ReSurvey plot`, Lon_updated, Lat_updated,
group_coords, `Expert System`, `Location method`, plot_unique_id) %>%
ungroup() %>%
# Convert dates to date format and get the year
mutate(date = dmy(`Date of recording`), year = year(date)) %>%
select(-`Date of recording`, -date, -group_coords) %>%
# Add unique identifiers for each observation
mutate(obs_unique_id = row_number())
print(db_Europa, width = Inf)
Save to csv (file for us):
write_csv(db_Europa,here("data", "clean","db_Europa_20250107.csv"))
Save to csv (file for Bea, with only essential info):
write_csv(db_Europa %>%
select(obs_unique_id, plot_unique_id, Lon_updated, Lat_updated,
year),
here("data", "clean","db_Europa_20241210_short.csv"))
Based on information got from Jesper.
db_DK_J<-read_tsv(here("data", "raw",
"DK_Naturdata_Res_habitat_hab_codes_Jesper",
"DK_Naturdata_Res_habitat_hab_codes.txt"))
Rows: 158800 Columns: 9── Column specification ────────────────────────────────────────────────────
Delimiter: "\t"
chr (2): HABITAT, Dataset
dbl (7): PlotObservationID, RELEVE_NR, CIRC_ID, PLOT5_ID, PLOT15_ID, Acc...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
db_resurv <- db_resurv %>%
# Keeping all obs in db_resurv but not all in db_DK_J
left_join(db_DK_J %>% select(PlotObservationID, HabitatID))
Joining with `by = join_by(PlotObservationID)`
print(db_resurv %>% distinct(HabitatID), n = 100)
Write csv:
write_csv(db_resurv %>% distinct(HabitatID),
here("data", "clean","list_HabitatID_DK.csv"))
Cases without ESy EUNIS habitat:
nrow(db_resurv %>% filter(is.na(`Expert System`)))/nrow(db_resurv)
[1] 0.6814982
Cases without ESy EUNIS habitat but with HabitatID from DK:
nrow(db_resurv %>% filter(is.na(`Expert System`)&!is.na(HabitatID)))/nrow(db_resurv)
[1] 0.2727117
Cases without ESy EUNIS habitat and without HABITAT from DK:
nrow(db_resurv %>%
filter(is.na(`Expert System`)&is.na(HabitatID)))/nrow(db_resurv)
[1] 0.4087865
Cases without ESy EUNIS habitat and without HabitatID from DK where data is presence / absence:
nrow(db_resurv %>%
filter(is.na(`Expert System`) &
is.na(HabitatID) &
`Cover abundance scale` == "Presence/Absence"))/
nrow(db_resurv)
[1] 0.1655851
Cases without ESy EUNIS habitat and without HabitatID from DK where data is not presence / absence:
nrow(db_resurv %>%
filter(is.na(`Expert System`) &
is.na(HabitatID) &
`Cover abundance scale` != "Presence/Absence"))/
nrow(db_resurv)
[1] 0.2432014
db_resurv <- db_resurv %>%
mutate(HabitatID = as.character(HabitatID)) %>%
mutate(HabitatID = ifelse(HabitatID == "9998", "91D0",
ifelse(HabitatID == "9999", "91E0", HabitatID)))
Read correspondences file:
correspondences<-read_excel(here("data", "edited",
"correspondence_HabitatID_DK.xlsx"))
Add info to db_resurv:
db_resurv <- db_resurv %>%
# Keeping all obs in db_resurv but not all in db_DK_J
left_join(correspondences %>% select(HabitatID, EUNIS))
Joining with `by = join_by(HabitatID)`
Correct NA values in EUNIS
db_resurv <- db_resurv %>%
mutate(EUNIS = ifelse(EUNIS == "NA", NA, EUNIS))
Add info on EUNIS (DK) to EUNISa:
db_resurv <- db_resurv %>%
mutate(EUNISa =
# If EUNIS (DK) is available, add as EUNISa
ifelse(!is.na(EUNIS), EUNIS,
# Otherwise keep EUNISa
EUNISa),
EUNIS_assignation = ifelse(!is.na(EUNIS), "Info from DK",
ifelse(is.na(EUNISa), "Not possible",
"Expert system"))) %>%
# Remove column EUNIS (DK)
select(-EUNIS)
ggplot(db_resurv, aes(EUNIS_assignation)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS assignation")
write_csv(db_resurv %>%
filter(is.na(`Expert System`)&is.na(HabitatID)),
here("output", "csv","issue5.csv"))
Update the columns for the different EUNISs levels:
db_resurv <- db_resurv %>%
mutate(
# EUNISa levels
EUNISa_1 = substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 2, 1)),
EUNISa_2 = ifelse(
nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 3, 2),
substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 3, 2)),
NA_character_
),
EUNISa_3 = ifelse(
nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 4, 3),
substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 4, 3)),
NA_character_
),
EUNISa_4 = ifelse(
nchar(EUNISa) >= ifelse(str_starts(EUNISa, "MA"), 5, 4),
substr(EUNISa, 1, ifelse(str_starts(EUNISa, "MA"), 5, 4)),
NA_character_
)
) %>%
# Remove HabitatID column
select(-HabitatID)
Update columns with descriptions for the level 1 codes:
db_resurv <- db_resurv %>%
mutate(
EUNISa_1_descr = case_when(
EUNISa_1 == "V" ~ "Vegetated man-made habitats",
EUNISa_1 == "U" ~ "Inland habitats with no or little soil",
EUNISa_1 == "T" ~ "Forests and other wooded land",
EUNISa_1 == "S" ~ "Heathlands, scrub and tundra",
EUNISa_1 == "R" ~ "Grasslands",
EUNISa_1 == "Q" ~ "Wetlands",
EUNISa_1 == "P" ~ "Inland waters",
EUNISa_1 == "N" ~ "Coastal habitats",
EUNISa_1 == "MA" ~ "Marine habitats",
TRUE ~ NA_character_
)
)
Recalculate how many different EUNIS codes have been assigned:
db_resurv <- db_resurv %>%
mutate(
# Count the number of non-NA values across the EUNIS columns
n_EUNIS = rowSums(!is.na(select(., EUNISa:EUNISd)))
)
ggplot(db_resurv, aes(n_EUNIS)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "Number of differnt EUNIS codes assigned") + coord_flip()
ggplot(db_resurv %>% filter(n_EUNIS > 0), aes(n_EUNIS)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "Number of differnt EUNIS codes assigned") + coord_flip()
New plot for EUNISa_1 (the first assigned EUNIS in cases of multiple assignations, level 1):
ggplot(db_resurv, aes(EUNISa_1_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 1") + coord_flip()
ggplot(db_resurv %>% filter(!is.na(EUNISa_1_descr)), aes(EUNISa_1_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 1") + coord_flip()
descriptions<-read_excel(here("data", "edited",
"EUNIS-Habitats-2021-06-01_modified.xlsx"))
# Define the columns and corresponding description column names
eunis_cols <- c("EUNISa_2", "EUNISa_3", "EUNISa_4",
"EUNISb_2", "EUNISb_3", "EUNISb_4",
"EUNISc_2", "EUNISc_3", "EUNISc_4",
"EUNISd_2", "EUNISd_3", "EUNISd_4")
# Create corresponding description column names
descr_col_names <- paste0(eunis_cols, "_descr")
# Use reduce to loop through the columns and join dynamically based on level
db_resurv <- reduce(seq_along(eunis_cols), function(data, i) {
# Extract level number from the column name (e.g., EUNISa_2 -> 2)
level <- as.numeric(gsub("\\D", "", eunis_cols[i]))
# Filter descriptions for the corresponding level
descriptions_level <- descriptions %>%
filter(level == level) %>%
select(`EUNIS 2020 code`, `EUNIS-2021 habitat name`)
# Perform the left_join and rename the column dynamically
data %>%
left_join(
descriptions_level,
by = setNames("EUNIS 2020 code", eunis_cols[i])
) %>%
rename(!!descr_col_names[i] := `EUNIS-2021 habitat name`)
}, .init = db_resurv)
The matching did not work sometimes, correct!
# Correct EUNISa levels 2-4 descriptions
db_resurv <- db_resurv %>%
mutate(EUNISa_2_descr =
ifelse(!is.na(EUNISa_2_descr), EUNISa_2_descr,
case_when(
EUNISa_2 == "Pf" ~ "Fresh-water submerged vegetation",
EUNISa_2 == "Pj" ~ "Stonewort vegetation",
EUNISa_2 == "R4" ~ "Alpine and subalpine grasslands",
EUNISa_2 == "Pb" ~ "Calcareous spring and spring brook",
EUNISa_2 == "Qb" ~ "Wetlands",
EUNISa_2 == "R3" ~ "Seasonally wet and wet grasslands",
EUNISa_2 == "Qa" ~ "Mires",
EUNISa_2 == "Pa" ~ "Base-poor spring and spring brook",
EUNISa_2 == "Ph" ~ "Oligotrophic-water vegetation",
EUNISa_2 == "Pg" ~ "Fresh-water nymphaeid vegetation",
EUNISa_2 ==
"Pd" ~ "Fresh-water small pleustophyte vegetation",
EUNISa_2 == "Pc" ~ "Brackish-water vegetation",
EUNISa_2 ==
"Pe" ~ "Fresh-water large pleustophyte vegetation",
EUNISa_2 == "Pi" ~ "Dystrophic-water vegetation",
EUNISa_2 == "S1" ~ "Tundra",
EUNISa_2 ==
"U7" ~ "Unvegetated or sparsely vegetated gravel bars",
EUNISa_2 == "Q6" ~ "Periodically exposed shores",
TRUE ~ NA_character_)
),
EUNISa_3_descr =
ifelse(!is.na(EUNISa_3_descr), EUNISa_3_descr,
case_when(
EUNISa_3 =="U71" ~ "Unvegetated or sparsely vegetated gravel bar in montane and alpine regions",
EUNISa_3 =="Q61" ~ "Periodically exposed shore with stable, eutrophic sediments with pioneer or ephemeral vegetation",
EUNISa_3 =="Q62" ~ "Periodically exposed shore with stable, mesotrophic sediments with pioneer or ephemeral vegetation",
TRUE ~ NA_character_
))
)
# Correct EUNISb levels 2-4 descriptions
db_resurv <- db_resurv %>%
mutate(EUNISb_2_descr =
ifelse(!is.na(EUNISb_2_descr), EUNISb_2_descr,
case_when(
EUNISb_2 == "Pj" ~ "Stonewort vegetation",
EUNISb_2 == "R4" ~ "Alpine and subalpine grasslands",
EUNISb_2 == "Pf" ~ "Fresh-water submerged vegetation",
TRUE ~ NA_character_)
)
)
EUNISc and EUNISd levels 2-4 are OK.
https://www.sci.muni.cz/botany/chytry/Schaminee_etal2021_EEA-Report-Aquatic-Wetland-habitats.pdf
EUNISa_2 == “Q6” : “Periodically exposed shores” EUNISa_3 = “Q61” : “Periodically exposed shore with stable, eutrophic sediments with pioneer or ephemeral vegetation” EUNISa_3 == “Q62” : “Periodically exposed shore with stable, mesotrophic sediments with pioneer or ephemeral vegetation”
This classification of Q + numbers is now coexisting in the database with Qa & Qb (metadata). How to proceed?
db_resurv %>% filter(EUNISa_1 == "Q") %>% distinct(EUNISa_2)
ggplot(db_resurv %>% filter(EUNISa_1 == "MA"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "MA") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","MA_level2.tiff"),
width=14,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "N"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "N") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","N_level2.tiff"),
width=14,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "P"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "P") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","P_level2.tiff"),
width=14,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "Q"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "Q") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","Q_level2.tiff"),
width=14,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "R"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "R") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","R_level2.tiff"),
width=14,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "S"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "S") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","S_level2.tiff"),
width=16,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "T"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "T") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","T_level2.tiff"),
width=14,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "U"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "U") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","U_level2.tiff"),
width=16,height=8,units="cm",dpi=300)
ggplot(db_resurv %>% filter(EUNISa_1 == "V"), aes(EUNISa_2_descr)) +
geom_bar(aes(y = (..count..) / sum(..count..) * 100)) +
labs(y = "Percentage of ReSurvey observations",
x = "EUNIS level 2") + coord_flip() +
ggtitle(db_resurv %>% filter(EUNISa_1 == "V") %>% distinct(EUNISa_1_descr))
ggsave(filename=here("output", "figures","V_level2.tiff"),
width=14,height=8,units="cm",dpi=300)
sessionInfo()
R version 4.4.2 (2024-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 10 x64 (build 19045)
Matrix products: default
locale:
[1] LC_COLLATE=Spanish_Spain.utf8 LC_CTYPE=Spanish_Spain.utf8
[3] LC_MONETARY=Spanish_Spain.utf8 LC_NUMERIC=C
[5] LC_TIME=Spanish_Spain.utf8
time zone: Europe/Paris
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] readxl_1.4.3 purrr_1.0.2 stringr_1.5.1 ggplot2_3.5.1
[5] lubridate_1.9.4 dplyr_1.1.4 tidyr_1.3.1 readr_2.1.5
[9] here_1.0.1
loaded via a namespace (and not attached):
[1] sass_0.4.9 utf8_1.2.4 generics_0.1.3 stringi_1.8.4
[5] hms_1.1.3 digest_0.6.37 magrittr_2.0.3 evaluate_1.0.1
[9] grid_4.4.2 timechange_0.3.0 fastmap_1.2.0 cellranger_1.1.0
[13] rprojroot_2.0.4 jsonlite_1.8.9 fansi_1.0.6 scales_1.3.0
[17] jquerylib_0.1.4 cli_3.6.3 rlang_1.1.4 crayon_1.5.3
[21] bit64_4.5.2 munsell_0.5.1 withr_3.0.2 cachem_1.1.0
[25] yaml_2.3.10 tools_4.4.2 parallel_4.4.2 tzdb_0.4.0
[29] colorspace_2.1-1 vctrs_0.6.5 R6_2.5.1 lifecycle_1.0.4
[33] bit_4.5.0.1 vroom_1.6.5 pkgconfig_2.0.3 pillar_1.9.0
[37] bslib_0.8.0 gtable_0.3.6 glue_1.8.0 xfun_0.49
[41] tibble_3.2.1 tidyselect_1.2.1 knitr_1.49 farver_2.1.2
[45] htmltools_0.5.8.1 rmarkdown_2.29 labeling_0.4.3 compiler_4.4.2